barplot - Python no puede encontrar mi módulo
pandas plot (2)
Esencialmente, cuando ejecuta script.py
directamente, no sabe que es parte de un submódulo de src
, ni sabe dónde podría estar un módulo llamado src
. Este es el caso en python 2 o 3.
Como sabe, Python encuentra módulos basados en los contenidos de sys.path
. Para importar cualquier módulo, este debe estar ubicado en un directorio que figura en sys.path
o en el mismo directorio que el script que está ejecutando.
Cuando dice python src/scripts/script.py
, sys.path
incluye el Project/src/scripts/
(porque allí es donde se encuentra script.py
), pero no el Project
. Como Project
no está en la ruta, los módulos en ese directorio ( src
) no pueden importarse.
Para arreglar esto:
Supongo que su script.py
es un punto de entrada para su módulo src
(por ejemplo, tal vez sea el programa principal). Si eso es cierto, entonces puede solucionarlo moviendo script.py
hasta el mismo nivel que src
:
Project
├───.git
├───venv
|───script.py <--- script.py moves up here
└───src
├───__init__.py
└───mymodules
├───__init__.py
├───module1.py
└───module2.py
De esta manera, script.py
puede importar libremente cualquier cosa en src
, pero nada en src
puede importar script.py
.
Si ese no es el caso, y script.py
realmente forma parte de src
, puede usar el argumento -m
de python para ejecutar script.py
como parte del módulo src
manera:
$ python -m src.scripts.script
Como le ha dicho a python qué módulo está ejecutando ( src
), estará en la ruta. Entonces, script.py
sabrá que es un submódulo de src
, y luego podrá importar desde src
.
Tenga cuidado en esta situación, sin embargo, existe la posibilidad de crear una importación circular si algo en src
importa src.scripts.script
.
Como alternativa a estos dos enfoques, puede modificar sys.path
directamente en script.py
:
import sys
sys.path.insert(0, ''/path/to/Project'') # location of src
Mientras esto funciona, generalmente no es mi preferencia. Requiere que script.py
sepa exactamente cómo se distribuye su código, y puede causar confusión en la importación si otro programa python alguna vez intenta importar script.py
.
Tengo un proyecto de python (que ejecuto dentro de un virtualenv) y que tiene la siguiente estructura:
Project
├───.git
├───venv
└───src
├───__init__.py
├───mymodules
│ ├───__init__.py
│ ├───module1.py
│ └───module2.py
└───scripts
├───__init__.py
└───script.py
script.py
import src.mymodules.module1
...
Ejecuto el proyecto con venv activado y desde el directorio del proyecto usando el siguiente comando:
(venv)$ python src/scripts/script.py
La secuencia de comandos se ejecuta pero muestra el siguiente error antes de salir:
Traceback (most recent call last):
File "src/scripts/script.py", line 1, in <module>
import src.mymodules.module1
ImportError: No module named src.mymodules.module1
Intenté ejecutar el shell de python e intentar importar el módulo desde allí y no se produjeron errores. Tengo _ _init__.py en cada directorio dentro de src. ¿Python considera que el directorio de trabajo es src / scripts? ¿Por qué está sucediendo eso y cómo puedo hacer que src sea el directorio de trabajo si ese es el caso?
Project
├───.git
├───venv
└───src
├───__init__.py
├───mymodules
│ ├───__init__.py
│ ├───module1.py
│ └───module2.py
└───scripts
├───__init__.py
└───script.py
Alternativamente, puede importar como lo siguiente en su script.py
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__),''../../''))
import src.mymodules.module1
Ahora puede ejecutar el archivo script.py desde cualquier ubicación.
e.g :
python script.py
python /path to folder/script.py