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_importen 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
Projectasys.path? - ¿Cómo podría ejecutar
test_module1.pyen el intérprete interactivo? Porpython prjt/pkg1/tests/test_module1.pyopython -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