from - python libraries
Forma correcta de "ImportaciĆ³n absoluta" en Python 2.7 (5)
Cómo el módulo Python Find
python encontrará el módulo de sys.path
, y la primera entrada sys.path[0]
es '''', python encontrará el módulo del directorio de trabajo actual
import sys
print sys.path
y Python encuentran un módulo de terceros de site-packages
de site-packages
así que para una importación absoluta, puedes
añada su paquete al sys.path
import sys
sys.path.append(''the_folder_of_your_package'')
import module_you_created
module_you_created.fun()
exportar PYTHONPATH
PYTHONPATH se importará en sys.path antes de la ejecución
export PYTHONPATH=the_folder_of_your_package
import sys
[p for p in sys.path if ''the_folder_of_your_package'' in p]
¿Cómo podría ejecutar test_module1.py en el intérprete interactivo? Por python Project / pkg1 / tests / test_module1.py o python -m Project / pkg1 / tests / test_module1.py?
puedes usar if __name__ == ''__main__'':
manera idiomática, y usar python Project/pkg1/tests/test_module1.py
if __name__ = ''__main__'':
main()
- Python 2.7.10
- En virtualenv
- Habilitar
from __future__ import absolute_import
en cada módulo
El árbol de directorios se ve así:
Project/
prjt/
__init__.py
pkg1/
__init__.py
module1.py
tests/
__init__.py
test_module1.py
pkg2/
__init__.py
module2.py
tests/
__init__.py
test_module2.py
pkg3/
__init__.py
module3.py
tests/
__init__.py
test_module3.py
data/
log/
Intenté usar la función compute()
de pkg2/module2.py
en pkg1/module1.py
escribiendo como:
# In module1.py
import sys
sys.path.append(''/path/to/Project/prjt'')
from prjt.pkg2.module2 import compute
Pero cuando ejecuté python module1.py
, el intérprete planteó un ImportError that No module named prjt.pkg2.module2
.
- ¿Cuál es la forma correcta de "importación absoluta"? ¿Debo agregar la ruta de
Project
asys.path
? - ¿Cómo podría ejecutar
test_module1.py
en el intérprete interactivo? Porpython prjt/pkg1/tests/test_module1.py
opython -m prjt/pkg1/tests/test_module1.py
?
Importe la ruta del proyecto externo.
sys.path.append(''/path/to/Project'')
O importe "calcular" desde pkg2
from pkg2.module2 import compute
Si agrega sys.path.append(''path/to/Project'')
en prjt/__init__.py
, debe importar los submódulos de modo que: from pkg2.module2 import compute
(sin la especificación prjt
) porque la importación del paquete prjt
está en progreso y la carpeta de nivel superior no está en sys.path
. Esto es exactamente lo que @Cissoid sugirió.
Por cierto, from __future__ import absolute_import
no es necesario para Py> = 2.6.
Respondiendo a su segunda pregunta ... Tengo una estructura muy similar para la subcarpeta unittest, así que en el pkg/unittests/testall.py
escribí lo siguiente:
testfolder = os.path.abspath(os.path.dirname(__file__))
project_root = os.path.abspath(os.path.join(testfolder, r"../.."))
sys.path.append(project_root)
import pkg
Lo ejecuto sin la opción -m
porque es una complicación innecesaria.
Usando importaciones relativas explícitas, esto debería funcionar desde module1.py
:
from ..pkg2.module2 import compute()
Esto es más limpio que jugar con PYTHONPATH
...
prueba esto
import os, sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ''..'')))
Esto dará un camino absoluto