Instalar un paquete de Python en un directorio diferente usando pip?

435

Sé que la respuesta obvia es usar virtualenv y virtualenvwrapper, pero por varias razones no puedo / no quiero hacer eso.

Entonces, ¿cómo modifico el comando?

pip install package_name

hacer pipinstalar el paquete en otro lugar que no sea el predeterminado site-packages?

Monika Sulik
fuente
2
Ahora pregunta número dos: cuando ya está instalando en un directorio personalizado, cómo hacer que pipNO intente eliminar una versión anterior de un directorio no personalizado. Por ejemplo, uno para todo el sistema, donde no tiene permisos de escritura. Hasta ahora solo logré esto con easy_install...
Tomasz Gandor
2
@TomaszGandor Creo que usar la --ignore-installedopción debería evitar que pip intente desinstalar paquetes ya instalados.
Piotr Dobrogost
lo siento, soy nuevo con pip, pero ¿es su pregunta lo mismo que preguntar "cómo instalar pi en una versión diferente de python"? Tengo python 3.4 y 3.5 pero quiero que mis instalaciones de pip vayan a python 3.5.
Charlie Parker
@ Charlie Nope, pregunta diferente. No sé lo suficiente sobre su instalación / intenciones, pero en general probablemente usaría virtualenvwrapper y crearía un entorno virtual con algo comomkvirtualenv --python=/usr/bin/python3.5 env_name
Monika Sulik

Respuestas:

334

Utilizar:

pip install --install-option="--prefix=$PREFIX_PATH" package_name

También puede usar --ignore-installedpara forzar la reinstalación de todas las dependencias con este nuevo prefijo. Puedes usar --install-optionvarias veces para agregar cualquiera de las opciones que puedes usar python setup.py install( --prefixprobablemente sea lo que quieras, pero hay muchas más opciones que puedes usar).

Ian Bicking
fuente
55
Si hace esto, ¿hay alguna manera pip freezede ver el directorio alternativo?
Russ
77
pip freeze se ve en el camino, por lo que si algo así PYTHONPATH=$PREFIX_PATH/lib/python2.6/site-packages pip freezedebería verlos.
Ian Bicking
44
El uso --prefix=$PREFIX_PATHno parece permitir tener un control total del directorio de instalación ya que se le agrega un sufijo específico del sistema ( \Lib\site-packagesen Windows, por ejemplo). ¿Hay alguna manera de especificar un directorio específico?
Piotr Dobrogost
1
@Piotr: sí, hay mi respuesta. El uso de '--prefix' es un poco tosco, pero funciona bien si desea que su python puro vaya a /usr/lib/pythonX.Y/site-packages en lugar de /usr/local/lib/pythonX.Y/site- paquetes
Anthon
80
No es una mala respuesta hace 4 años, pero la opción --target existe ahora.
Tritium21
545

El interruptor --target es lo que estás buscando:

pip install --target=d:\somewhere\other\than\the\default package_name

Pero aún necesita agregar d:\somewhere\other\than\the\defaulta PYTHONPATHpara usarlos realmente desde esa ubicación.

-t, --target <dir>
Instalar paquetes en <dir>. Por defecto, esto no reemplazará los archivos / carpetas existentes en <dir>.
Use --upgrade para reemplazar los paquetes existentes en <dir> con nuevas versiones.


Pip de actualización si el interruptor de destino no está disponible:

En Linux u OS X:

pip install -U pip

En Windows (esto soluciona un problema ):

python -m pip install -U pip
Janusz Skonieczny
fuente
8
@DanH corre pip install --upgrade pip!
r3m0t
16
Esta es la verdadera respuesta, es solo que la opción se agregó bastante después de la respuesta aceptada.
bukzor
55
¿Cuál es la diferencia entre lo --install-option="--prefix=$PREFIX_PATH"mencionado por @Ian Bicking y la --target=$PATHopción?
Hibou57
66
targetes una opción de pip, y todo lo que ingrese se install-optionpasará a setup.py install command. Básicamente targetes la ubicación personalizada de los paquetes del sitio.
Janusz Skonieczny
10
El uso --targetpuede resultar en una instalación parcial, ya que no instalará ningún archivo de scripts / datos incluido en el prefijo especificado. Parece que pasa --prefixcon --install-optiones la única forma adecuada para tener un control total sobre las instalaciones utilizadas prefijo.
Kenneth Hoste
74

En lugar de la --targetopción o la --install-optionsopción, he encontrado que lo siguiente funciona bien (de la discusión sobre un error relacionado con esto en https://github.com/pypa/pip/issues/446 ):

PYTHONUSERBASE=/path/to/install/to pip install --user

(O configure el PYTHONUSERBASEdirectorio en su entorno antes de ejecutar el comando, utilizandoexport PYTHONUSERBASE=/path/to/install/to )

Este sistema utiliza la muy útil --useropción que dice que para hacer los bin, lib, sharey otros directorios que cabe esperar bajo un prefijo personalizado en lugar de $HOME/.local.

A continuación, puede añadir a su PATH, PYTHONPATHy otras variables como lo haría un directorio de instalación normal.

Tenga en cuenta que también es posible que deba especificar las opciones --upgradey --ignore-installedsi los paquetes de los que esto depende requieren la instalación de versiones más recientes en el PYTHONUSERBASEdirectorio, para anular las versiones proporcionadas por el sistema.

Un ejemplo completo:

PYTHONUSERBASE=/opt/mysterypackage-1.0/python-deps pip install --user --upgrade numpy scipy

... para instalar scipyy numpyempaquetar las versiones más recientes en un directorio que luego puede incluir en su PYTHONPATHgusto (usando bash y para python 2.6 en CentOS 6 para este ejemplo):

export PYTHONPATH=/opt/mysterypackage-1.0/python-deps/lib64/python2.6/site-packages:$PYTHONPATH
export PATH=/opt/mysterypackage-1.0/python-deps/bin:$PATH

¡Usar virtualenv sigue siendo una solución mejor y más ordenada!

David Gardner
fuente
44
Esto funcionó con Travis CI ejecutándose en contenedores Docker, mientras que la solución --install-option = "- prefix = $ PREFIX_PATH" no lo hizo.
32bits
1
Pregunta de Noobie, qué tan importante es la /bincarpeta que crea el pip, la --usercrea como lo hace --PREFIXmientras --targetque no.
Jonathan
1
Si el paquete está instalado en Python global, --ignore-installedes necesario.
George Sovetov
1
Esta opción también es compatible con --editablelas instalaciones locales.
mdh
1
Esta opción es útil para instalar paquetes como superusuario para otro usuario no root sin tener que sudesplazarse (lo que puede ser problemático en los contenedores, por ejemplo).
mdh
43

La instalación de un paquete Python a menudo solo incluye algunos archivos Python puros. Si el paquete incluye datos, scripts y / o ejecutables, estos se instalan en diferentes directorios de los archivos Python puros.

Suponiendo que su paquete no tiene datos / scripts / ejecutables, y que desea que entren sus archivos de Python /python/packages/package_name(y no algunos subdirectorios a unos niveles por debajo /python/packagescomo cuando los usa --prefix), puede usar el comando de una sola vez:

pip install --install-option="--install-purelib=/python/packages" package_name

Si desea que todos (o la mayoría) de sus paquetes vayan allí, puede editarlos ~/.pip/pip.confpara incluir:

[install]
install-option=--install-purelib=/python/packages

De esa manera no puede olvidarse de tener que especificarlo una y otra vez.

Todos los archivos ejecutables / datos / scripts incluidos en el paquete aún irán a sus lugares predeterminados a menos que especifique opciones de instalación adicionales ( --prefix/ --install-data/ --install-scripts, etc., para obtener detalles, consulte las opciones de instalación personalizadas ).

Anthon
fuente
1
Una gran ventaja para el archivo de configuración. Personalmente especifico --prefixallí, porque tengo un directorio "local" en un servidor compartido en el directorio de inicio, y fue utilizado como prefijo easy_installantes de mudarme pip. Sistema $PATHy $PYTHONPATHse configuraron antes. En lugar de install-option=--install-purelib=/blahesta nueva target=/blahopción / interruptor. También es agradable, pero a veces solo necesitas un reemplazo para --prefixusar con setup.pyo easy_install.
Tomasz Gandor
18

Nadie parece haber mencionado la opción -t, pero esa es la más fácil:

pip install -t <direct directory> <package>
Erwan
fuente
8
La -topción es la versión corta de la --targetopción que se ha descrito en otra respuesta ( stackoverflow.com/a/19404371/594053 ) :)
MattiSG
14

Solo agregue un punto a la respuesta de @Ian Bicking:

Utilizando el --user opción para especificar el directorio instalado también funciona si se desea instalar algún paquete de Python en el directorio principal (sin derecho de usuario de sudo) en el servidor remoto.

P.ej,

pip install --user python-memcached

El comando instalará el paquete en uno de los directorios que figuran en su PYTHONPATH.

Buena voluntad
fuente
14

Probé estas opciones con python3.5 y pip 9.0.3:

pip install --target / myfolder [paquetes]

Instala TODOS los paquetes, incluidas las dependencias en / myfolder. No tiene en cuenta que los paquetes dependientes ya están instalados en otra parte de Python. Encontrará paquetes de / myfolder / [package_name]. En caso de que tenga varias versiones de Python, esto no lo tiene en cuenta (no hay versión de Python en el nombre de la carpeta del paquete).

pip install --prefix / myfolder [paquetes]

Los cheques son dependencias ya instaladas. Instalará paquetes en /myfolder/lib/python3.5/site-packages/[packages]

pip install --root / myfolder [paquetes]

Comprueba dependencias como --prefix pero la ubicación de instalación será /myfolder/usr/local/lib/python3.5/site-packages/[package_name].

pip install --user [paquetes]

Instalará paquetes en $ HOME: /home/[USERfont>/.local/lib/python3.5/site-packages Python busca automáticamente desde esta ruta .local para que no necesite ponerlo en su PYTHONPATH.

=> En la mayoría de los casos, el usuario es la mejor opción para usar. En caso de que la carpeta de inicio no se pueda usar por alguna razón, entonces --prefix.

Mikko
fuente
Al ejecutarse en Python 2.7.16, --target (o --prefix) instala Jinja2-2.10.1.dist-info / por ejemplo, mientras que instalar --install-option = "- prefijo instala Jinja2-2.10.1-py2 .7.egg-info /, que es lo que realmente quería
Greg Dougherty
13

Las versiones más recientes de pip(8 o posterior) pueden usar directamente la --prefixopción :

pip install --prefix=$PREFIX_PATH package_name

donde $PREFIX_PATHes el prefijo de instalación donde se colocan lib, bin y otras carpetas de nivel superior.

Mike T
fuente
10
pip install packageName -t pathOfDirectory

o

pip install packageName --target pathOfDirectorty
Kundan Kaushik
fuente
4

Para agregar al consejo ya bueno, ya que tuve un problema al instalar IPython cuando no tenía permisos de escritura para/usr/local .

pip usa distutils para hacer su instalación y este hilo discute cómo eso puede causar un problema ya que se basa ensys.prefix configuración.

Mi problema ocurrió cuando la instalación de IPython intentó escribir en '/ usr / local / share / man / man1' sin permiso . Como la instalación falló, no parecía escribir los archivos IPython en el directorio bin.

El uso de "--user" funcionó y los archivos se escribieron en ~ / .local. Agregar ~ / .local / bin a $ PATH significaba que podía usar "ipython" desde allí.

Sin embargo, estoy tratando de instalar esto para varios usuarios y me dieron permiso de escritura en el /usr/local/lib/python2.7directorio. Creé un directorio "bin" debajo y establecí directivas para distutils:

vim ~/.pydistutils.cfg

[install]
install-data=/usr/local/lib/python2.7
install-scripts=/usr/local/lib/python2.7/bin

entonces ( -Ise usa para forzar la instalación a pesar de fallas anteriores / instalación local):

pip install -I ipython

Luego agregué /usr/local/lib/python2.7/bina $PATH.

Pensé que incluiría esto en caso de que alguien más tenga problemas similares en una máquina a la que no tienen acceso de sudo.

Stuart Brock
fuente
2

Si está utilizando brew con python, desafortunadamente, pip / pip3 se envía con opciones muy limitadas. No tiene las opciones --install-option, --target, --user como se mencionó anteriormente.

Nota sobre la instalación de pip --user
La instalación de pip normal --user está deshabilitada para Python preparado. Esto se debe a un error en distutils, porque Homebrew escribe un distutils.cfg que establece el prefijo del paquete. Una posible solución (que coloca scripts ejecutables en ~ / Library / Python /./ bin) es: python -m pip install --user --install-option="--prefix=" <package-name>

Puede encontrar esta línea muy engorrosa. Sugiero usar pyenv para la administración. Si estas usando

brew upgrade python python3

Irónicamente, en realidad estás degradando la funcionalidad de pip.

(Publico esta respuesta, simplemente porque pip en mi mac osx no tiene la opción --target, y he pasado horas reparándola)

anónimo
fuente
Esta respuesta con un prefijo explícito, y ignore-installeddebido a esfuerzos anteriores, funcionó para mí:python -m pip install --user --install-option="--prefix='/myFunkyApp/lib'" --ignore-installed <package-name>
Jeremy Jones
0

Con pip v1.5.6en Python v2.7.3(GNU / Linux), la opción --rootpermite especificar un prefijo de instalación global, (aparentemente) independientemente de las opciones específicas del paquete. Intenta fi,

$ pip install --root=/alternative/prefix/path package_name
sphakka
fuente
0

Sugiero seguir la documentación y crear el archivo ~ / .pip / pip.conf. Tenga en cuenta que en la documentación faltan directorios de encabezado especificados, lo que conduce al siguiente error:

error: install-base or install-platbase supplied, but installation scheme is incomplete

El contenido de trabajo completo del archivo conf es:

[install]
install-base=$HOME
install-purelib=python/lib
install-platlib=python/lib.$PLAT
install-scripts=python/scripts
install-headers=python/include
install-data=python/data

Desafortunadamente puedo instalarlo, pero cuando intento desinstalar pip me dice que no existe tal paquete para el proceso de desinstalación ... así que algo sigue mal pero el paquete va a su ubicación predefinida.

kensai
fuente
0

pip install /path/to/package/

Ahora es posible.

La diferencia con esto y al usar el indicador -eo --editablees que -eenlaza con el lugar donde se guarda el paquete (es decir, su carpeta de descargas), en lugar de instalarlo en su ruta de Python.

Esto significa que si elimina / mueve el paquete a otra carpeta, no podrá usarlo.

AH
fuente
esto no responde la pregunta
Clintm