¿Cuál es la forma correcta de corregir este error ImportError?
Tengo la siguiente estructura de directorio:
/home/bodacydo
/home/bodacydo/work
/home/bodacydo/work/project
/home/bodacydo/work/project/programs
/home/bodacydo/work/project/foo
Y estoy en el directorio
/home/bodacydo/work/project
Ahora si escribo
python ./programs/my_python_program.py
Instantáneamente consigo
ImportError: No module named foo.tasks
El ./programs/my_python_program.py
contiene la siguiente línea:
from foo.tasks import my_function
No puedo entender por qué Python no encuentra ./foo/tasks.py
, está ahí.
Si lo hago desde el shell de Python, entonces funciona:
python
>>> from foo.tasks import my_function
Solo no funciona si lo llamo a través de un python ./programs/my_python_program.py
script.
__init__.py
solo indica que el directorio debe tratarse como un paquete, cuando su padre está dentrosys.path
o es en sí mismo un paquete.export PYTHONPATH=`pwd`
/home/bodacydo/work
... vea esta respuesta¿Tiene un archivo llamado
__init__.py
en el directorio foo? Si no es así, Python no reconocerá a foo como un paquete de Python.Consulte la sección sobre paquetes en el tutorial de Python para obtener más información.
fuente
__init__.py
. El problema esta vez fue con$PYTHONPATH
. La solución de Ignacio funcionó.Aquí hay una solución paso a paso:
Añadir un script llamado
run.py
en/home/bodacydo/work/project
y edición de esta manera:(reemplace
main()
con su método equivalente enmy_python_program
.)/home/bodacydo/work/project
run.py
Explicación: dado que Python agrega a PYTHONPATH la ruta de la secuencia de comandos desde la que se ejecuta , se
run.py
agregará la ejecución/home/bodacydo/work/project
. Y voilà ,import foo.tasks
se encontrará.fuente
Solución de ejemplo para agregar la biblioteca a su PYTHONPATH.
Agregue la siguiente línea en su ~ / .bashrc o simplemente ejecútela directamente:
Luego, vincule su biblioteca requerida a su carpeta ~ / .python, por ejemplo
fuente
Una mejor solución que la configuración
PYTHONPATH
es usarpython -m module.path
Esto se configurará correctamente
sys.path[0]
y es una forma más confiable de ejecutar módulos.Tengo una reseña rápida sobre este problema, ya que otros respondedores han mencionado que la razón de esto es que se
python path/to/file.py
colocapath/to
al principio dePYTHONPATH
(sys.path
).fuente
En mi mente, debo considerar que la
foo
carpeta es una biblioteca independiente. Es posible que desee considerar moverlo a laLib\site-packages
carpeta dentro de una instalación de Python. Es posible que desee considerar agregar unfoo.pth
archivo allí.Sé que es una biblioteca ya que
./programs/my_python_program.py
contiene la siguiente línea:Así que no importa que
./programs
sea una carpeta hermana./foo
. Es el hecho de quemy_python_program.py
se ejecuta como un script como este:fuente
Si tiene este problema al usar una versión instalada, al usar
setup.py
, asegúrese de que su módulo esté incluido dentropackages
fuente