Resumen
Hay tres categorías generales de módulos con los que está tratando:
- Aquellos programas de soporte instalados para todos los usuarios con el sistema de paquetes del sistema operativo. (Esto incluso puede incluir herramientas y bibliotecas utilizadas por personas que programan en Python; ver más abajo). Para estos, usa los paquetes del sistema operativo donde puede e
pip
instala en los directorios del sistema cuando sea necesario.
- Aquellos programas de soporte instalados por un usuario en particular solo para su propio uso, y también para ciertos aspectos de su uso "cotidiano" de Python como lenguaje de secuencias de comandos. Para estos ella usa
pip --user
, quizás pyenv o pythonz , y herramientas y tácticas similares.
- Aquellos que apoyan el desarrollo y el uso de una aplicación específica. Para estos, usted usa
virtualenv
(o una herramienta similar).
Cada nivel aquí también puede estar recibiendo apoyo de un nivel anterior. Por ejemplo, nuestro usuario en (2) puede depender de un intérprete de Python instalado a través de paquetes del sistema operativo.
Entrando en esto con un poco más de detalle:
Programas del sistema y paquetes
Los programas escritos en Python que desea "simplemente ejecutar" son fáciles: simplemente use las herramientas de instalación del sistema operativo y permita que traigan lo que necesiten; Esto no es diferente de un programa que no sea Python. Es probable que esto traiga herramientas / bibliotecas de Python (¡como el propio intérprete de Python!) En las que los usuarios de su máquina pueden comenzar a confiar; Esto no es un problema siempre y cuando comprendan la dependencia e, idealmente, conozcan medios alternativos para manejarla en hosts que no proporcionan esas dependencias.
Un ejemplo común y simple de tal dependencia son algunos de mis scripts personales ~/.local/bin/
que comienzan con #!/usr/bin/env python
. Estos funcionarán bien (siempre que se ejecuten bajo Python 2) en RH / CentOS 7 y la mayoría (pero no todas) las instalaciones de Ubuntu; no lo harán bajo una instalación básica de Debian o en Windows. Por mucho que no me guste que mi entorno personal tenga muchas dependencias en los paquetes del sistema operativo (trabajo en varios sistemas operativos diferentes), algo como esto me parece bastante aceptable; mi plan de respaldo en los hosts raros que no tienen un sistema Python y no pueden obtener uno es ir con un sistema de Usuario como se describe a continuación.
Las personas que usan un intérprete de Python del sistema también suelen depender del sistema pip3
. Ahí es donde generalmente dibujo la línea en las dependencias de mi sistema; todo de virtualenv
adelante trato conmigo mismo. (Por ejemplo, mi script de activación estándar se basa en lo que sea pip3
o pip
está en el camino, pero descarga su propia copia virtualenv
para arrancar el entorno virtual que está creando.
Dicho esto, probablemente hay circunstancias en las que es perfectamente razonable hacer más disponible un entorno de desarrollo. Es posible que tenga interfaces de Python en paquetes complejos (como un DBMS) donde desea usar la versión del sistema y cree que es mejor, también permite que el sistema elija el código de biblioteca de Python particular que usará para hablar con él. O puede estar implementando una gran cantidad de hosts con un entorno de desarrollo básico para una clase de Python, y le resulta más fácil automatizar con paquetes de sistema estándar.
Programas y paquetes "del día a día" del usuario
Los usuarios pueden tener bibliotecas o programas de Python que no encajan bien en un entorno virtual porque en primer lugar quieren ayudar a crear entornos virtuales (por ejemplo, virtualenvwrapper ) o son cosas que usualmente se usan desde la línea de comandos, incluso mientras haciendo trabajo que no sea de Python. Incluso si tienen la capacidad de instalar versiones del sistema de estos, pueden sentirse más cómodos instalando los suyos propios (por ejemplo, porque quieren usar la última versión de la herramienta y sus dependencias).
En general, pip --user
es lo que la gente usará para esto, aunque ciertas dependencias, como el propio intérprete de Python, requieren un poco más que eso. pyenv y pythonz son útiles para construir intérpretes personales (ya sea que se instalen ~/.local/bin
para ser el intérprete predeterminado o no) y, por supuesto, siempre se puede construir "a mano" desde la fuente si las bibliotecas de desarrollo están disponibles.
Intento mantener el conjunto mínimo de cosas instaladas aquí: virtualenvwrapper (porque lo uso constantemente) y tal vez la última versión de pip. Intento evitar dependencias fuera de la biblioteca estándar o en Python 3 para los scripts personales que escribo para ser utilizados en muchos hosts. (Aunque veremos cuánto tiempo puedo aguantar eso mientras muevo más y más de estos scripts personales a Python).
Desarrollo separado de aplicaciones y entornos de tiempo de ejecución
Esto es lo habitual de virtualenv. Para el desarrollo, casi siempre debería usar un virtualenv para asegurarse de que no está usando dependencias del sistema, o a menudo más de uno para probar diferentes versiones de Python.
Estos entornos virtuales también son buenos para aplicaciones con muchas dependencias en las que desea evitar contaminar su entorno de usuario. Por ejemplo, generalmente configuro un virtualenv para ejecutar portátiles Jupyter y similares.