Combine --user con --prefix error con setup.py install

103

Estaba intentando instalar paquetes de Python en un sistema al que recientemente obtuve acceso. Estaba tratando de aprovechar el directorio de paquetes de sitios por usuario relativamente nuevo de Python y la nueva opción --user. (La opción no está documentada actualmente , sin embargo, existe para Python 2.6+; puede ver la ayuda ejecutando python setup.py install --help).

Cuando intenté correr

python setup.py install --user

en cualquier paquete que descargué, siempre recibí el siguiente error:

error: can't combine user with with prefix/exec_prefix/home or install_(plat)base

El error fue muy desconcertante, ya que, como se puede ver, no estaba proporcionando la --prefix, --exec-prefix, --install-base, o --install-platbasebanderas como las opciones de línea de comandos. Perdí mucho tiempo tratando de averiguar cuál era el problema. Documento mi respuesta a continuación, con la esperanza de ahorrarle a otra pobre alma unas horas de afeitado de yak .

gotgenes
fuente
2
Recibí el mismo error al intentar instalar Python 3.6 desde la fuente con ./configure --prefix=${HOME}"user = 1" en ~/.pydistutils.cfg. En ese caso, necesito comentar temporalmente "usuario = 1" para que el proceso de instalación pueda completarse.
bli
bli dio una buena pista. Me preguntaba de dónde viene la opción --user aunque no utilicé esa opción. pip install --prefix / home / myhomedir. No tengo el archivo ~ / .pydistutils.cfg, sigo buscando dónde está configurada la opción --user.
Kemin Zhou
Averigua la fuente del problema. Esto es específico de Debian. Después de agregar la opción --system para pip, el problema desapareció.
Kemin Zhou

Respuestas:

161

Solución temporal única:

pip install --user --install-option="--prefix=" <package_name>

o

python setup.py install --user --prefix=

Tenga en cuenta que no hay texto (ni siquiera espacios en blanco) después de =.

No , no se olvide de la --userbandera.

Instalación de varios paquetes:

Cree ~/.pydistutils.cfg(o equivalente para su sistema operativo / plataforma) con el siguiente contenido:

[install]
prefix=

Tenga en cuenta que no hay texto (ni siquiera espacios en blanco) después de =.

Luego ejecute los comandos necesarios pip install --usero python setup.py install --user. No , no se olvide de la --userbandera.

Finalmente, elimine o cambie el nombre de este archivo. Dejar este archivo presente causará problemas al instalar paquetes de Python en todo el sistema (es decir, sin --user) como este usuario con esto ~/.pydistutils.cfg.

La causa de este problema

Esto parece ser un problema tanto con OpenSUSE como con RedHat, lo que ha provocado un error en virtualenv en estas plataformas.

El error se debe a un archivo de configuración de distutils a nivel del sistema (en mi caso /usr/lib64/python2.6/distutils/distutils.cfg) donde había esto

[install]
prefix=/usr/local

Básicamente, esto equivale a ejecutar siempre el comando de instalación como install --prefix=/usr/local. Debe anular esta especificación utilizando una de las técnicas anteriores.

gotgenes
fuente
1
Muchas gracias. El prefijo vacío solucionó mi problema: pip 1.1 openSuSE 11.4.
guettli
6
También puede pasar un --prefix = vacío a setup.py en la línea de comando para anular el valor en distutils.cfg de todo el sistema
Tuxdude
2
¡Guauu! Esto funcionó para mí también. Recibí el mismo error al intentar instalar Powerline. powerline.readthedocs.org/en/latest/installation/…
A-Dubb
4
Pensándolo bien, hacer esto causará GRANDES problemas. NO guarde este archivo. Consulte brew doctor para obtener más información (asumiendo que está usando homebrew en Mac OS X).
A-Dubb
1
Tenga en cuenta que mantener este archivo así hará que Python piense que / es su directorio raíz de la biblioteca de Python, lo que provocará problemas confusos si intenta instalar otros paquetes nuevos.
rogueleaderr
6

Como se ha señalado en los comentarios, la respuesta aceptada (por @gotgenes, quien, presumiblemente, tiene genes) puede llevar a consecuencias inesperadas.

@rogeleaderr dice: "Tenga en cuenta que mantener este archivo así hará que Python piense que / es su directorio raíz de la biblioteca de Python, lo que genera problemas confusos si intenta instalar otros paquetes nuevos".

En lugar de escribir un nuevo archivo de configuración, como recomienda @gotgenes, una mejor opción es agregar --prefix= (sin texto a la derecha del signo igual) como una opción en la línea de comando , como en

$ python setup.py install --user --prefix=
dbliss
fuente
5

Publicar para ahorrar tiempo a otros, ya que ninguna respuesta disponible funcionó para mí ...

En algunos entornos, el uso del modificador --target( -t) seguirá produciendo el mismo error. En mis pruebas en dos versiones de Linux, encontré el mismo problema al usar el --prefix=parámetro.

Código:

PYTHONUSERBASE=/tmp/ pip install --user --force-reinstall $PACKAGE

Explicación: Mi solución, que parece funcionar en muchos entornos (MacOS, Amazon Linux, Debian) es configurar la PYTHONUSERBASEvariable de entorno en una ubicación temporal. --force-reinstallse usa para activar la instalación local incluso cuando el paquete ya está instalado.

Esto dará como resultado que el módulo se compile / instale (según el sistema operativo y la versión de Python) para: /tmp/lib/python2.7/site-packages/*

EE1213
fuente
0

Simplemente puede ejecutar pip install --user ., no se requieren argumentos de prefijo.

De todos modos, esto es mejor porque estará predeterminado en python3 si su pip está configurado para usar Python 3. (Olvidé ingresar python3 setup.pye instalé un paquete de solo 3 en 2.7)

(crédito https://stackoverflow.com/a/1550235/4364036 )

Wesinat0r
fuente
0

Tuve el mismo problema. Estaba escondido dentro del ~/.config/pip/pip.confcon:

[global]
target=/foo/bar

Dicha configuración fue creada por un script de terceros sin mi conocimiento.

Sugiero verificar los archivos de configuración de pip y eliminar las target=/foo/baropciones.

señor__finley
fuente