2012-07-09 18 views
13

He la estructura siguiente código fuentePython importación paquete de directorio padre

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

donde testmsg define las siguientes constantes:

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í?

+0

¿Cómo se ejecuta el código? –

+0

@SimeonVisser ejecutando 'python sub/testprinter.py', pero también' python testprinter.py' dentro del directorio 'sub' no funciona. –

Respuesta

8

Todo depende de que la escritura plazo. 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 

A continuación, ejecute TestApp/run_test.pyprimera:

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

Entonces 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 here;

+0

¿Puede depender del hecho de que no generé un archivo setup.py? Lo que quiero decir es que seguí la estructura del paquete python, pero no generé el método de instalación, suponiendo que también podría funcionar sin tener que 'setup.py install' it. –

+0

@CodeShining, no, no importa. Solo incluí 'setup.py' en el ejemplo para mayor claridad. Lo que realmente importa, como dije en el primer párrafo de la respuesta, es ** qué archivo está ejecutando en primer lugar **. Si inicia (ejecuta) un archivo dentro del paquete, no verá el paquete. Por lo tanto, es una buena práctica tener su script principal (el que ** ejecuta **) fuera del paquete. – nosklo

6

Uso relativa de las importaciones como a continuación

from .. import testmsg 
+0

pero ser un paquete ¿no debería funcionar como se esperaba? No usaría relative si se espera que funcione –

+0

CodeShining, mire la decisión de Dido para Python 3.5 PEP-328 para estándar. [link] (http://www.python.org/dev/peps/pep-0328/#guido-s-decision) –

4

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

How to import a python file in a parent directory

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

Aquí hay algo que hice para importar nada. Por supuesto, debe copiar esta secuencia de comandos en directorios locales, importarla 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) 
Cuestiones relacionadas