python - same - ¿Por qué usar sys.path.append(ruta) en lugar de sys.path.insert(1, ruta)?
python relative import (3)
Editar: basado en un comentario de Ulf Rompe, es importante que uses "1" en lugar de "0" , de lo contrario sys.path .
He estado haciendo python durante bastante tiempo (más de un año), y siempre estoy confundido acerca de por qué las personas recomiendan usar sys.path.append()
lugar de sys.path.insert()
. Déjame demostrar.
Digamos que estoy trabajando en un módulo llamado PyWorkbooks (que está instalado en mi computadora), pero estoy trabajando simultáneamente en un módulo diferente (digamos PyJob) que incorpora PyWorkbooks. Mientras estoy trabajando en PyJob encuentro errores en PyWorkbooks que estoy corrigiendo, así que me gustaría importar una versión de desarrollo.
Hay varias maneras de trabajar en ambos (podría poner mi proyecto de PyWorkbooks dentro de PyJob, por ejemplo), pero a veces todavía necesitaré jugar con la ruta. Sin embargo, no puedo simplemente hacer sys.path.append()
a la carpeta donde está PyWorkbooks . ¿Por qué? ¡Porque Python encontrará primero mis PyWorkbooks instalados!
Es por eso que tienes que hacer un sys.path.insert (1, path_to_dev_pyworkbooks)
En resumen:
sys.path.append(path_to_dev_pyworkbooks)
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one
o:
sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0**
import PyWorkbooks # imports correct file
Esto me ha causado algunas suspensiones en el pasado, y realmente me gustaría si nosotros (como comunidad) sys.path.insert(1, path)
recomendar sys.path.insert(1, path)
, como si estuviera insertando manualmente una ruta, creo que es ¡es seguro decir que ese es el camino que quieres usar!
¿O tengo algo mal? ¡Es una pregunta que a veces me molesta y lo quería abiertamente!
Si realmente necesita usar sys.path.insert, considere dejar sys.path [0] como está:
sys.path.insert(1, path_to_dev_pyworkbooks)
Esto podría ser importante ya que el código de terceros puede basarse en el cumplimiento de la documentación de sys.path :
Como se inicializó al inicio del programa, el primer elemento de esta lista, ruta [0], es el directorio que contiene la secuencia de comandos que se utilizó para invocar el intérprete de Python.
Si tiene varias versiones de un paquete / módulo, debe usar virtualenv (énfasis mío):
virtualenv
es una herramienta para crear entornos de Python aislados.El problema básico que se aborda es una de dependencias y versiones, y permisos indirectos. Imagine que tiene una aplicación que necesita la versión 1 de LibFoo, pero otra aplicación requiere la versión 2. ¿Cómo puede usar ambas aplicaciones? Si instala todo en
/usr/lib/python2.7/site-packages
(o en la ubicación estándar de su plataforma), es fácil terminar en una situación en la que, involuntariamente, actualice una aplicación que no debería actualizarse.O, en términos más generales, ¿qué ocurre si desea instalar una aplicación y dejarla en funcionamiento ? Si una aplicación funciona, cualquier cambio en sus bibliotecas o las versiones de esas bibliotecas pueden romper la aplicación.
Además, ¿qué sucede si no puede instalar paquetes en el directorio global
site-packages
? Por ejemplo, en un host compartido.En todos estos casos,
virtualenv
puede ayudarlo. Crea un entorno que tiene sus propios directorios de instalación, que no comparte bibliotecas con otros entornos Virtualenv (y opcionalmente tampoco tiene acceso a las bibliotecas instaladas globalmente).
Es por eso que las personas consideran que insert(0,
estar equivocado, es una solución incompleta y provisional al problema de la administración de múltiples entornos.
estás confundiendo el concepto de agregar y anteponer. el siguiente código es precedente:
sys.path.insert(1,''/thePathToYourFolder/'')
coloca la información nueva al principio (bueno, en segundo lugar, para ser precisos) de la secuencia de búsqueda que atravesará su intérprete. sys.path.append()
coloca las cosas al final de la secuencia de búsqueda.
es aconsejable que utilice algo como virtualenv
lugar de codificar manualmente los directorios de sus paquetes en PYTHONPATH
cada vez. para configurar varios ecosistemas que separan sus paquetes de sitios y las posibles versiones de python, lea estos dos blogs:
Si decide avanzar por el camino hacia el aislamiento del medio ambiente, sin duda se beneficiará al buscar en virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/