Pregunta

Otro desarrollador y estoy de acuerdo acerca de si PYTHONPATH o sys.path debe utilizarse para permitir Python para encontrar un paquete de Python en un usuario (por ejemplo, el desarrollo) guía.

Tenemos un proyecto de Python con una estructura de directorios típica:

Project
    setup.py
    package
        __init__.py
        lib.py
        script.py

En script.py, tenemos que hacer import package.lib. Cuando el paquete se instala en site-packages, script.py puede encontrar package.lib.

Cuando se trabaja a partir de un directorio de usuarios, sin embargo, algo más que hay que hacer. Mi solución es establecer mi PYTHONPATH para incluir "~ / Proyecto". Otro desarrollador quiere poner esta línea de código en el inicio de script.py:

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

Así que Python puede encontrar la copia local de package.lib.

Creo que esto es una mala idea, ya que esta línea sólo es útil para los desarrolladores o personas que van de una copia local, pero no puedo dar una buena razón por qué es una mala idea.

¿Debemos utilizar PYTOHNPATH, sys.path, o es o bien?

¿Fue útil?

Solución

Si la única razón para modificar la ruta es para los desarrolladores que trabajan desde su árbol de trabajo, se debe usar una herramienta de instalación para configurar su entorno para usted. virtualenv es muy popular, y si está utilizando setuptools, simplemente puede ejecutar setup.py develop a semi-instalar el árbol de trabajo en su instalación de Python actual.

Otros consejos

No me gusta PYTHONPATH. Me resulta frágil y molesto para establecer sobre una base por usuario (especialmente para los usuarios del demonio) y no perder de vista que las carpetas de proyectos se mueven alrededor. Me gustaría mucho establecer sys.path en las secuencias de comandos de invocación para proyectos independientes.

Sin embargo sys.path.append no es la manera de hacerlo. Usted puede conseguir fácilmente duplicados, y no en orden los ficheros .pth. Mejor (y más legible):. site.addsitedir

Y script.py normalmente no sería el lugar más apropiado para hacerlo, ya que es dentro de el paquete que desea que esté disponible en el camino. módulos de biblioteca ciertamente no debería estar tocando sys.path sí mismos. En su lugar, usted tiene normalmente un script hashbanged fuera del paquete que se utiliza para crear una instancia y ejecutar la aplicación, y es en este guión envoltorio trivial que había puesto los detalles de implementación como sys.path-frobbing.

En general me volvería a considerar el establecimiento de una variable de entorno (como PYTHONPATH) ser una mala práctica. Si bien esto puede estar bien para el que está de depuración pero usando esto como
una práctica regular podría no ser una buena idea.

El uso de la variable de entorno lleva a situaciones como "funciona para mí" cuando alguien
lo demás informes de problemas en la base de código. También se podría realizar la misma práctica con el entorno de prueba, así, lo que lleva a situaciones como las pruebas que se ejecutan bien para una en particular desarrollador, pero probablemente no cuando alguien pone en marcha las pruebas.

Junto con las muchas otras razones ya mencionadas, se puede también señalar que outh la codificación dura

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

es frágil, ya que supone la localización de script.py - sólo funcionará si script.py se encuentra en proyecto / paquete. Se romperá si un usuario decide mover / copiar / script.py enlace simbólico (casi) cualquier otro lugar.

Creo, que en este caso utilizando PYTHONPATH es una cosa mejor, sobre todo porque no introduce (cuestionable) código innecesario.

Después de todo, si se piensa en ello, el usuario no es necesario que lo sys.path, debido a que su paquete se instalan en site-packages, porque se va a utilizar un sistema de envasado.

Si el usuario opta por ejecutar desde una "copia local", como usted lo llama, entonces yo he observado, que la práctica habitual es que el estado, que el paquete necesita ser añadido a PYTHONPATH manualmente, si se utiliza fuera de la site-packages.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top