modules from example another python python-2.7 python-import

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 .

  1. ¿Cuál es la forma correcta de "importación absoluta"? ¿Debo agregar la ruta de Project a sys.path ?
  2. ¿Cómo podría ejecutar test_module1.py en el intérprete interactivo? Por python prjt/pkg1/tests/test_module1.py o python -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