J'ai la structure de code source suivante
/testapp/
/testapp/__init__.py
/testapp/testmsg.py
/testapp/sub/
/testapp/sub/__init__.py
/testapp/sub/testprinter.py
où testmsg
définit la constante suivante:
MSG = "Test message"
et sub/testprinter.py
:
import testmsg
print("The message is: {0}".format(testmsg.MSG))
Mais je reçois ImportError: No module named testmsg
Cela ne devrait-il pas fonctionner depuis la structure du package? Je ne veux pas vraiment étendre sys.path dans chaque sous-module et je ne veux même pas utiliser l'importation relative.
Qu'est-ce que je fais mal ici?
Tout dépend du script que vous exécutez . Le chemin de ce script sera ajouté automatiquement au chemin de recherche de python.
Faites-en la structure suivante:
TestApp/
TestApp/README
TestApp/LICENSE
TestApp/setup.py
TestApp/run_test.py
TestApp/testapp/__init__.py
TestApp/testapp/testmsg.py
TestApp/testapp/sub/
TestApp/testapp/sub/__init__.py
TestApp/testapp/sub/testprinter.py
Exécutez ensuite TestApp/run_test.py
d'abord:
from testapp.sub.testprinter import functest ; functest()
Alors TestApp/testapp/sub/testprinter.py
pourrait faire:
from testapp.testmsg import MSG
print("The message is: {0}".format(testmsg.MSG))
Plus de bons conseils ici ;
Utilisez l'importation relative comme ci-dessous
from .. import testmsg
Cette question a la réponse - importation dynamique:
Comment importer un python dans un répertoire parent
import sys
sys.path.append(path_to_parent)
import parent.file1
Voici quelque chose que j'ai fait pour importer quoi que ce soit. Bien sûr, vous devez toujours copier ce script dans des répertoires locaux, l'importer et use
le chemin souhaité.
import sys
import os
# a function that can be used to import a python module from anywhere - even parent directories
def use(path):
scriptDirectory = os.path.dirname(sys.argv[0]) # this is necessary to allow drag and drop (over the script) to work
importPath = os.path.dirname(path)
importModule = os.path.basename(path)
sys.path.append(scriptDirectory+"\\"+importPath) # Effing mess you have to go through to get python to import from a parent directory
module = __import__(importModule)
for attr in dir(module):
if not attr.startswith('_'):
__builtins__[attr] = getattr(module, attr)