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-platbase
banderas 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 .
fuente
./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.Respuestas:
Solución temporal única:
o
Tenga en cuenta que no hay texto (ni siquiera espacios en blanco) después de
=
.No , no se olvide de la
--user
bandera.Instalación de varios paquetes:
Cree
~/.pydistutils.cfg
(o equivalente para su sistema operativo / plataforma) con el siguiente contenido:Tenga en cuenta que no hay texto (ni siquiera espacios en blanco) después de
=
.Luego ejecute los comandos necesarios
pip install --user
opython setup.py install --user
. No , no se olvide de la--user
bandera.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 estoBá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.fuente
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 enfuente
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:
Explicación: Mi solución, que parece funcionar en muchos entornos (MacOS, Amazon Linux, Debian) es configurar la
PYTHONUSERBASE
variable de entorno en una ubicación temporal.--force-reinstall
se 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/*
fuente
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.py
e instalé un paquete de solo 3 en 2.7)(crédito https://stackoverflow.com/a/1550235/4364036 )
fuente
Tuve el mismo problema. Estaba escondido dentro del
~/.config/pip/pip.conf
con: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/bar
opciones.fuente