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


103

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-platbasebandeiras 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 .


2
Recebi o mesmo erro ao tentar instalar o python 3.6 da fonte com ./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.
bli

bli deu uma boa dica. Eu queria saber de onde vem a opção --user, mesmo eu não usei essa opção. pip install --prefix / home / myhomedir. Não tenho o arquivo ~ / .pydistutils.cfg, continuo procurando onde a opção --user está definida.
Kemin Zhou

Descubra a origem do problema. Isso é específico do Debian. Depois de adicionar a opção --system para pip, o problema foi embora.
Kemin Zhou

Respostas:


161

Solução alternativa única:

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

ou

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

Observe que não há texto (nem mesmo espaço em branco) após o =.

Não se esqueça da --userbandeira.

Instalando vários pacotes:

Crie ~/.pydistutils.cfg(ou equivalente para seu sistema operacional / plataforma) com o seguinte conteúdo:

[install]
prefix=

Observe que não há texto (nem mesmo espaço em branco) após o =.

Em seguida, execute os comandos pip install --userou necessários python setup.py install --user. Não se esqueça da --userbandeira.

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 este

[install]
prefix=/usr/local

Basicamente, 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.


1
Muito obrigado. O prefixo vazio corrigiu meu problema: pip 1.1 openSuSE 11.4.
guettli

6
Você também pode passar um --prefix = vazio para setup.py na linha de comando para substituir o valor no distutils.cfg de todo o sistema
Tuxdude

2
Uau! Isso funcionou para mim também. Recebi o mesmo erro ao tentar instalar o Powerline. powerline.readthedocs.org/en/latest/installation/…
A-Dubb

4
Pensando bem, isso causará problemas PRINCIPAIS. NÃO mantenha este arquivo por perto. Consulte o brew doctor para obter mais informações (presumindo que você esteja usando o homebrew no Mac OS X).
A-Dubb

1
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.
rogueleaderr

6

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 em

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

5

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:

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

Explicação: Minha solução alternativa, que parece funcionar em muitos ambientes (MacOS, Amazon Linux, Debian), é definir a PYTHONUSERBASEvariá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/*


0

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.pye ele instalou um pacote somente 3 em 2.7)

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


0

Eu tive o mesmo problema. Estava escondido dentro do ~/.config/pip/pip.confcom:

[global]
target=/foo/bar

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/baropções.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.