web-dev-qa-db-fra.com

Python importation de package depuis le répertoire parent

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

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?

20
user1543863

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 ;

18
nosklo

Utilisez l'importation relative comme ci-dessous

from .. import testmsg
11
Vinayak Kolagi

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)
6
B T