Importación de paquetes Python desde el directorio padre

Tengo la siguiente estructura de código fuente

/testapp/ /testapp/__init__.py /testapp/testmsg.py /testapp/sub/ /testapp/sub/__init__.py /testapp/sub/testprinter.py 

donde testmsg define la siguiente constante:

 MSG = "Test message" 

y sub/testprinter.py :

 import testmsg print("The message is: {0}".format(testmsg.MSG)) 

Pero estoy obteniendo ImportError: No module named testmsg

¿No debería estar funcionando desde la estructura del paquete? Realmente no quiero extender sys.path en cada submódulo y ni siquiera quiero usar la importación relativa.

¿Qué estoy haciendo mal aquí?

Todo depende de qué script se ejecute . La ruta de ese script se agregará automáticamente a la ruta de búsqueda de python.

Que sea la siguiente estructura:

 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 

Luego ejecute TestApp/run_test.py primero :

 from testapp.sub.testprinter import functest ; functest() 

Luego, TestApp/testapp/sub/testprinter.py podría hacer:

 from testapp.testmsg import MSG print("The message is: {0}".format(testmsg.MSG)) 

Más buenos consejos aquí ;

Utilice la importación relativa como a continuación

 from .. import testmsg 

Esta pregunta tiene la respuesta – importación dinámica:

Cómo importar un archivo python en un directorio principal

 import sys sys.path.append(path_to_parent) import parent.file1 

Aquí hay algo que hice para importar cualquier cosa. Por supuesto, aún debe copiar este script en los directorios locales, importarlo y use la ruta que desee.

 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)