xticks barplot python path packages

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