Eu estava tentando instalar pacotes Python em um sistema ao qual ganhei acesso recentemente. Eu estava tentando tirar proveito do diretório de pacotes de sites por usuário relativamente novo do Python e da nova opção --user
. (A opção não está documentada no momento ; no entanto, ela existe para Python 2.6+; você pode ver a ajuda executando python setup.py install --help
.)
Quando tentei correr
python setup.py install --user
em qualquer pacote que baixei, sempre recebo o seguinte erro:
error: can't combine user with with prefix/exec_prefix/home or install_(plat)base
O erro foi extremamente desconcertante, porque, como você pode ver, eu não estava fornecendo a --prefix
, --exec-prefix
, --install-base
, ou --install-platbase
bandeiras como opções de linha de comando. Perdi muito tempo tentando descobrir qual era o problema. Documento minha resposta abaixo, na esperança de poupar alguma outra pobre alma de algumas horas de barbear de iaque .
fonte
./configure --prefix=${HOME}
"user = 1" em~/.pydistutils.cfg
. Nesse caso, preciso comentar temporariamente "user = 1" para que o processo de instalação possa ser concluído.Respostas:
Solução alternativa única:
ou
Observe que não há texto (nem mesmo espaço em branco) após o
=
.Não se esqueça da
--user
bandeira.Instalando vários pacotes:
Crie
~/.pydistutils.cfg
(ou equivalente para seu sistema operacional / plataforma) com o seguinte conteúdo:Observe que não há texto (nem mesmo espaço em branco) após o
=
.Em seguida, execute os comandos
pip install --user
ou necessáriospython setup.py install --user
. Não se esqueça da--user
bandeira.Finalmente, remova ou renomeie este arquivo. Deixar este arquivo presente causará problemas ao instalar pacotes Python em todo o sistema (ou seja, sem
--user
) como este usuário com isso~/.pydistutils.cfg
.A causa deste problema
Isso parece ser um problema com o OpenSUSE e o RedHat, que gerou um bug no virtualenv nessas plataformas.
O erro decorre de um arquivo de configuração distutils em nível de sistema (no meu caso
/usr/lib64/python2.6/distutils/distutils.cfg
) onde havia esteBasicamente, isso equivale a sempre executar o comando install como
install --prefix=/usr/local
. Você deve substituir esta especificação usando uma das técnicas acima.fonte
Como foi observado nos comentários, a resposta aceita (por @gotgenes, que, presumivelmente, possui genes) pode levar a consequências inesperadas.
@rogeleaderr diz, "Observe que manter este arquivo assim fará o Python pensar que / é o diretório raiz da biblioteca do python, levando a problemas confusos se você tentar instalar outros novos pacotes."
Em vez de escrever um novo arquivo de configuração, como recomenda @gotgenes, a melhor opção é adicionar
--prefix=
(sem texto à direita do sinal de igual) como uma opção na linha de comando , como emfonte
Postando para economizar tempo de outras pessoas, pois nenhuma resposta disponível funcionou para mim ...
Em alguns ambientes, usar a opção
--target
(-t
) ainda causará o mesmo erro. Em meus testes em dois tipos de Linux, encontrei o mesmo problema ao usar o--prefix=
parâmetro.Código:
Explicação: Minha solução alternativa, que parece funcionar em muitos ambientes (MacOS, Amazon Linux, Debian), é definir a
PYTHONUSERBASE
variável de ambiente para um local temporário.--force-reinstall
é usado para acionar a instalação local, mesmo quando o pacote já está instalado.Isso resultará na compilação / instalação do módulo (dependendo do sistema operacional e da versão do Python) para:
/tmp/lib/python2.7/site-packages/*
fonte
Você pode simplesmente executar
pip install --user .
, sem a necessidade de args de prefixo.Isso é melhor de qualquer maneira porque o padrão será python3 se seu pip estiver configurado para usar Python 3. (esqueci de inserir
python3 setup.py
e ele instalou um pacote somente 3 em 2.7)(crédito https://stackoverflow.com/a/1550235/4364036 )
fonte
Eu tive o mesmo problema. Estava escondido dentro do
~/.config/pip/pip.conf
com:Essa configuração foi criada por um script de terceiros sem meu conhecimento.
Eu sugiro verificar os arquivos de configuração do pip e remover as
target=/foo/bar
opções.fonte