python3 - modulenotfounderror: no module named ''setuptools''
Combine--user with--prefix error with setup.py install (3)
Estaba intentando instalar paquetes de Python a los que tuve acceso recientemente. Estaba intentando aprovechar el relativamente nuevo directorio de paquetes de sitio por usuario de Python, y la nueva opción --user
. (La opción no está actualmente documentada , 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 extremadamente desconcertante porque, como puede ver, no proporcioné las --exec-prefix
--prefix
, --exec-prefix
, --install-base
, o --install-platbase
como opciones de línea de comando. Perdí mucho tiempo tratando de descubrir cuál era el problema. Documentaré mi respuesta a continuación, con la esperanza de ahorrarle a alguna otra alma pobre unas pocas horas de afeitado de yak .
Una solución temporal:
pip install --user --install-option="--prefix=" <package_name>
o
python setup.py install --user --prefix=
Tenga en cuenta que no hay texto (ni siquiera espacio en blanco) después de =
.
No olvides la bandera del --user
.
Instalación de paquetes múltiples:
Cree ~/.pydistutils.cfg
(o equivalente para su sistema operativo / plataforma) con los siguientes contenidos:
[install]
prefix=
Tenga en cuenta que no hay texto (ni siquiera espacio en blanco) después de =
.
Luego ejecute la pip install --user
necesaria pip install --user
o python setup.py install --user
. No olvides la bandera del --user
.
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 este ~/.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 proviene de un archivo de configuración de distutils a nivel de sistema (en mi caso /usr/lib64/python2.6/distutils/distutils.cfg
) donde había
[install]
prefix=/usr/local
Básicamente, esto es equivalente a ejecutar siempre el comando de install --prefix=/usr/local
como install --prefix=/usr/local
. Debe anular esta especificación utilizando una de las técnicas anteriores.
Como se ha señalado en los comentarios, la respuesta aceptada (por @gotgenes, que, presumiblemente, tiene genes) puede conducir a consecuencias inesperadas.
@rogeleaderr dice: "Tenga en cuenta que mantener este archivo como este 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 @gotgenes recomienda, 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=
Publicar para ahorrar tiempo a otros, ya que ninguna respuesta disponible funcionó para mí ...
En algunos entornos, el uso del --target
( -t
) seguirá --target
el mismo error. En mi prueba en dos versiones de Linux, encontré el mismo problema cuando uso el parámetro --prefix=
.
Código:
PYTHONUSERBASE=/tmp/ pip install --user --force-reinstall $PACKAGE
Explicación: Mi solución alternativa, que parece funcionar en muchos entornos (MacOS, Amazon Linux, Debian) es establecer la variable de entorno PYTHONUSERBASE
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 la compilación / instalación del módulo (según el sistema operativo y la versión de Python) a: /tmp/lib/python2.7/site-packages/*