modules example python pythonpath

example - sys path python



Efecto del uso de sys.path.insert(0, path) y sys.path(append) al cargar módulos (2)

Recientemente tuve un problema con un ImportError de python, donde se encontró el módulo cuando se ejecutaba en mi computadora local pero no en el servidor de CI. sys.path.append(path) este problema cambiando sys.path.append(path) en mi script con sys.path.insert(0, path) donde path es la ubicación del módulo de cadena.

Como este es mi módulo y no un paquete instalado ( pregunta relacionada ), ¿por qué el orden de las rutas soluciona este problema?


Debido a que Python comprueba los directorios en orden secuencial comenzando en el primer directorio en la lista sys.path , hasta que encuentre el archivo .py que estaba buscando.

Lo ideal es que el directorio actual o el directorio de la secuencia de comandos sea siempre el primer elemento de la lista, a menos que lo modifique, como lo hizo. De la documentation -

Como se inicializó al iniciar el programa, el primer elemento de esta lista, ruta [0], es el directorio que contiene el script que se usó para invocar al intérprete de Python. Si el directorio del script no está disponible (por ejemplo, si el intérprete se invoca interactivamente o si el script se lee desde la entrada estándar), la ruta [0] es la cadena vacía, que dirige a Python a buscar módulos en el directorio actual primero. Observe que el directorio de secuencias de comandos se inserta antes de las entradas insertadas como resultado de PYTHONPATH.

Por lo tanto, lo más probable es que haya un archivo .py con el mismo nombre que el módulo que estaba intentando importar, en el directorio actual (desde donde se ejecutó el script).

Además, una cosa a tener en cuenta sobre ImportError s, digamos que el error de importación dice - ImportError: No module named main - no significa que main.py esté sobrescrito, no, si se hubiera sobrescrito, no tendríamos problemas para leer. eso. Es un módulo por encima de este que se sobrescribió con un. py o algún otro archivo.

Ejemplo -

Mi estructura de directorio se ve como

- test - shared - __init__.py - phtest.py - testmain.py

Ahora desde testmain.py , llamo from shared import phtest , funciona bien.

Ahora digamos que introduzco un shared.py en el directorio de prueba`, ejemplo -

- test - shared - __init__.py - phtest.py - testmain.py - shared.py

Ahora, cuando trato de hacerlo from shared import phtest de testmain.py , obtendré el error -

ImportError: cannot import name ''phtest''

Como puede ver arriba, el archivo que está causando el problema es shared.py , no phtest.py .


Soy bastante principiante en Python y encontré que la respuesta de Anand fue muy buena pero bastante complicada para mí, así que trato de reformular:

1) los métodos de sys.path y sys.path no son específicos de sys.path y, como en otros idiomas, agregan un elemento a una lista o matriz y:
* append(item) añadir item al final de la lista,
* insert(n, item) inserta el item en la posición n en la lista ( 0 al principio, 1 después del primer elemento, etc.).

2) Como dijo Anand, python busca los archivos de importación en cada directorio de la ruta en el orden de la ruta, por lo que:
* Si no tiene colisiones de nombres de archivo, el orden de la ruta no tiene impacto,
* Si cuidas una función que ya está definida en la ruta y usas la función de append para agregar tu ruta, no obtendrás tu función sino la predefinida.

Pero creo que es mejor usar append y no insert para no sobrecargar el comportamiento estándar de Python, y usar nombres no ambiguos para sus archivos y métodos.