2012-01-30 13 views
9

¿Hay alguna manera de importar módulos con dependencias dentro del mismo directorio utilizando una ruta absoluta/relativa con "imp"?¿Cómo importar módulos con dependencias en la misma ruta absoluta/relativa con imp?

Aquí sigue la estructura de directorios:

. 
├── importFrom 
│   ├── dependant.py 
│   └── dependence.py 
└── test.py 

importaciones archivo test.py dependant.py usando:

modname=imp.load_source("testImp","importFrom/dependant.py") 

que a su vez las importaciones dependence.py direcly con:

import dependence 

Llamar a test.py da

Traceback (most recent call last): 
    File "test.py", line 3, in <module> 
    modname=imp.load_source("testImp","importFrom/dependant.py") 
    File "importFrom/dependant.py", line 1, in <module> 
    import dependence 
ImportError: No module named dependence 

Puede que valga la pena que load_source agregue la ruta del módulo cargado al cargador para que encuentre sus dependencias relativas automáticamente. Por ahora la única alternativa que he encontrado es la adición a la ruta del sistema, poniendo en test.py

Edición: He encontrado una forma mejor de hacer la importación en relación con la ruta, añade archivo para obtener el ruta absoluta de la persona que llama (la independencia del directorio de trabajo actual)

sys.path.append(os.path.join(os.path.dirname(__file__), 'importFrom')) 
import dependant 

Respuesta

0

IMO esto no es posible con load_source que no hace las cosas necesarias para que la importación en su archivo 'dependant.py' considere su directorio padre.

Debería bien hacer lo que se han sugerido (__init__.py en el directorio e importación absoluta en el módulo), o utilizar funciones find_module/load_module de nivel inferior que permite este tipo de cosas (ver 'camino' find_module argumento)

+0

Usando tup = imp.find_module ("dependiente", ["/ opt/importFrom /", "otro"]) imp.load_module ("dependiente", tup [0], tup [1], tup [2]) da el mismo error "Ningún módulo llamado dependencia". – a1an

+0

También creo que no es factible con load_source a partir de Python 2.7, por lo tanto la respuesta correcta es "no factible", tiene que usar un enfoque de solución – a1an

0

Es necesario tener en __init__.pyimportFrom directorio.

In [5]: ls importFrom/ 
dependance.py dependant.pyc dependence.pyc __init__.pyc 
dependant.py dependence.py __init__.py 

In [6]: from importFrom import dependant 

In [7]: dependant.dependence 
Out[7]: <module 'importFrom.dependence' from 'importFrom/dependence.py'> 

En lugar de importar en dependanttest, he utilizado intérprete de Python para mostrar la salida. En dependant.py, se importa dependance.

+1

Esto permite evitar agregar a la ruta para una importación estándar, todavía no funciona con imp.load_source, además, creo que tampoco funcionaría si el módulo que se va a importar está en un directorio completamente diferente – a1an

+0

hizo para crear un archivo __init__.py en el directorio importFrom? – Kracekumar

+0

Creé __init__.py y coloqué una importación importFrom.dependant en test.py que funciona. Todavía funciona porque el directorio importFrom es hijo directo del directorio que contiene test.py, no se puede especificar una ruta de acceso absoluta en una importación estándar. – a1an

Cuestiones relacionadas