¿Por qué usar sys.path.append (ruta) en lugar de sys.path.insert (1, ruta)?

Edición: basado en el comentario de Ulf Rompe, es importante que uses “1” en lugar de “0” , de lo contrario romperás 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 demostrarte.

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 trabajo en PyJob, encuentro errores en los PyWorkbooks que estoy corrigiendo, así que me gustaría importar una versión de desarrollo.

Hay varias formas de trabajar en ambos (podría poner mi proyecto de PyWorkbooks dentro de PyJob, por ejemplo), pero a veces todavía tendré que jugar con la ruta. Sin embargo, no puedo simplemente hacer un sys.path.append() a la carpeta donde está PyWorkbooks . ¿Por qué? ¡Porque Python encontrará mi PyWorkbooks instalado primero!

Es por esto que tiene 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 algunos problemas en el pasado, y realmente me gustaría si nosotros (como comunidad) comenzamos a recomendar sys.path.insert(1, path) , como si estuvieras 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 la quise abiertamente!

Si tiene varias versiones de un paquete / módulo, necesita usar virtualenv (énfasis mío):

virtualenv es una herramienta para crear entornos aislados de Python.

El problema básico que se está abordando es uno de las dependencias y versiones, e indirectamente los permisos. Imagina que tienes una aplicación que necesita la versión 1 de LibFoo, pero otra aplicación requiere la versión 2. ¿Cómo puedes usar ambas aplicaciones? Si instala todo en /usr/lib/python2.7/site-packages (o cualquiera que sea la ubicación estándar de su plataforma), es fácil terminar en una situación en la que involuntariamente actualiza una aplicación que no debería actualizarse.

O más generalmente, ¿qué sucede si desea instalar una aplicación y dejarla así ? Si una aplicación funciona, cualquier cambio en sus bibliotecas o las versiones de esas bibliotecas puede romper la aplicación.

Además, ¿qué sucede si no puede instalar paquetes en el directorio de site-packages global? Por ejemplo, en un host compartido.

En todos estos casos, virtualenv puede ayudarte. Crea un entorno que tiene sus propios directorios de instalación, que no comparte bibliotecas con otros entornos virtualesenv (y, opcionalmente, tampoco accede a las bibliotecas instaladas globalmente).

Es por eso que la gente considera insert(0, estar equivocado: es una solución incompleta y provisional para el problema de la administración de múltiples entornos).

Si realmente necesita usar sys.path.insert, considere dejar sys.path [0] tal como está:

 sys.path.insert(1, path_to_dev_pyworkbooks) 

Esto podría ser importante ya que el código de terceros puede depender de la conformidad de la documentación de sys.path :

Como se inicializó al iniciar el progtwig, 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.

Estás confundiendo el concepto de añadir y anteponer. el siguiente código está prepagando:

 sys.path.insert(1,'/thePathToYourFolder/') 

coloca la nueva información al principio (bueno, segundo, para ser precisos) de la secuencia de búsqueda por la que pasará su intérprete. sys.path.append() pone las cosas al final de la secuencia de búsqueda.

es aconsejable que use algo como virtualenv lugar de codificar manualmente los directorios de sus paquetes en PYTHONPATH cada vez. para configurar varios ecosistemas que separan los paquetes de su sitio y las posibles versiones de python, lea estos dos blogs:

  1. Introducción a los ecosistemas de Python.

  2. bootstrapping en entornos virtuales python

Si decide avanzar por el camino hacia el aislamiento del entorno, sin duda se beneficiaría al consultar virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/