Quiero agregar una ruta de biblioteca específica solo a python2. Después de agregar export PYTHONPATH="/path/to/lib/"
a mi .bashrc
, sin embargo, al ejecutar python3 se produce el error: ¡PYTHONPATH apunta a un directorio de paquetes de sitios para Python 2.x pero está ejecutando Python 3.x!
Creo que se debe a que python2 y python3 comparten la variable común PYTHONPATH
.
Entonces, ¿puedo establecer diferentes variables PYTHONPATH
respectivamente para python2 y python3? Si no, ¿cómo puedo agregar una ruta de biblioteca exclusivamente a una versión particular de python?
Puede crear un archivo de configuración mymodule.pth
bajo lib/site-packages
(en Windows) o lib/pythonX.Y/site-packages
(en Unix y Macintosh), y luego agregar una línea que contenga el directorio para agregar a la ruta de python.
De docs.python2 y docs.python3 :
Un archivo de configuración de ruta es un archivo cuyo nombre tiene el formato
name.pth
y existe en uno de los cuatro directorios mencionados anteriormente; su contenido son elementos adicionales (uno por línea) que se agregarán asys.path
. Los elementos no existentes nunca se agregan asys.path
, y no se verifica si el elemento hace referencia a un directorio en lugar de a un archivo. Ningún elemento se agrega asys.path
más de una vez. Las líneas en blanco y las líneas que comienzan con # se omiten. Se ejecutan las líneas que comienzan con laimport
(seguido de espacio o tabulador).
PYTHONPATH
es algo así como un hack en lo que respecta a la gestión de paquetes. Una solución “bonita” sería empaquetar tu biblioteca e instalarla .
Esto podría sonar más complicado de lo que es, así que déjame mostrarte cómo funciona.
Supongamos que su “paquete” tiene un único archivo llamado wow.py
y lo mantiene en /home/user/mylib/wow.py
.
Cree el archivo /home/user/mylib/setup.py
con el siguiente contenido:
from setuptools import setup setup(name="WowPackage", packages=["."], )
Eso es todo, ahora puede “instalar correctamente” su paquete en la distribución de Python de su elección sin la necesidad de preocuparse por PYTHONPATH
. En lo que respecta a la “instalación adecuada”, tiene al menos tres opciones:
“Realmente correcto”. Copiará su código a su directorio de paquetes de sitios de python:
$ python setup.py install
“Desarrollo”. Solo agregará un enlace desde los paquetes de sitio de python a /home/user/mylib
. Esto significa que los cambios de código en su directorio tendrán efecto.
$ python setup.py develop
“Usuario”. Si no desea escribir en los directorios del sistema, puede instalar el paquete (ya sea “correctamente” o “en modo de desarrollo”) en el directorio /home/user/.local
, donde Python también los encontrará por su cuenta. Para eso, simplemente agregue --user
al comando.
$ python setup.py install --user $ python setup.py develop --user
Para eliminar un paquete instalado en modo de desarrollo, haga
$ python setup.py develop -u
o
$ python setup.py develop -u --user
Para eliminar un paquete instalado “correctamente”, haga
$ pip uninstall WowPackage
Si su paquete es más interesante que un solo archivo (por ejemplo, tiene subdirectorios y demás), simplemente enumere los parámetros en el parámetro de packages
de la función de setup
(tendrá que listar todo de forma recursiva, por lo tanto, utilizará una función auxiliar para bibliotecas más grandes ). Una vez que lo aprendas, asegúrate de leer también un manual más detallado .
Al final, vaya y contribuya con su paquete a PyPI; es tan simple como llamar a la python setup.py sdist register upload
(aunque necesitará un nombre de usuario de PyPI).
Descubrí que no hay forma de modificar PYTHONPATH
que sea solo para python2
o solo para python3
. Tuve que usar un archivo .pth
.
Lo que tenía que hacer era:
$HOME/.local/lib/python${MAJOR_VERSION}.${MINOR_VERSION}/site-packages
.pth
en ese directorio .pth
es trabajo Para más información sobre `.pth. la syntax de los archivos y cómo funcionan, consulte: documentos de python2 y documentos de python3 .
( .pth
archivos en pocas palabras: cuando su intérprete de Python se inicie, se verá en ciertos directorios y verá el archivo .pth
, abrirá esos archivos, analizará los archivos y agregará esos directorios a su sys.path
(es decir, el mismo comportamiento que PYTHONPATH
) y haga que todos los módulos de Python ubicados en esos directorios estén disponibles para la importación normal.