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


Editar: basado en un comentario de Ulf Rompe, es importante que use "1" en lugar de "0"De lo contrario, se romperá sys.path.

He estado haciendo python durante bastante tiempo (más de un año), y siempre estoy confundido sobre por qué las personas recomiendan que uses sys.path.append() en 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 un 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) comenzáramos a recomendar sys.path.insert(1, path), como si estuviera insertando manualmente una ruta, creo que es seguro decir que esa es la ruta que desea usar.

¿O tengo algo mal? ¡Es una pregunta que a veces me molesta y lo quería abiertamente!


76
2018-04-10 19:19


origen


Respuestas:


Si tiene múltiples 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 cualquiera que sea 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é sucede si desea instalar una aplicación y déjalo estar? 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 mercado global? site-packages ¿directorio? Por ejemplo, en un host compartido.

En todos estos casos, virtualenv puedo ayudarte. 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 la gente considera insert(0, estar equivocado: es una solución incompleta y provisional al problema de la administración de múltiples entornos.


41
2018-04-10 19:23



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 depender de documentación de sys.path conformidad:

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.


40
2018-04-10 22:47



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() pone las cosas al final de la secuencia de búsqueda.

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

  1. introducción de los ecosistemas de pitón

  2. Arranque de entornos virtuales de python

Si decide avanzar por el camino hacia el aislamiento del medio ambiente, sin duda se beneficiaría si observa virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/


12
2018-06-24 18:01