Instale um pacote Python em um diretório diferente usando pip?

435

Sei que a resposta óbvia é usar virtualenv e virtualenvwrapper, mas por várias razões, não posso / não quero fazer isso.

Então, como eu modifico o comando

pip install package_name

fazer pipinstalar o pacote em outro lugar que não seja o padrão site-packages?

Monika Sulik
fonte
2
Agora, pergunta número dois: quando você já está instalando em um diretório personalizado, como fazer pipNÃO tentar remover a versão anterior de um diretório não personalizado. Por exemplo - em todo o sistema, em que você não tem permissões de gravação. Até agora, eu só consegui isso com easy_install...
Tomasz Gandor
2
@TomaszGandor Eu acho que usar a --ignore-installedopção deve impedir o pip de tentar desinstalar os pacotes já instalados.
Piotr Dobrogost 18/08/16
desculpe, eu sou novo no pip, mas sua pergunta é a mesma que perguntar "como instalar o pi em uma versão diferente do python"? Eu tenho python 3.4 e 3.5, mas quero que minhas instalações de pip acessem o python 3.5.
Charlie Parker
@ Charlie Nope, pergunta diferente. Eu não sei o suficiente sobre a sua instalação / intenções, mas geralmente eu provavelmente usaria virtualenvwrapper e criar um ambiente virtual com algo parecidomkvirtualenv --python=/usr/bin/python3.5 env_name
Monika Sulik

Respostas:

334

Usar:

pip install --install-option="--prefix=$PREFIX_PATH" package_name

Você também pode usar --ignore-installedpara forçar a reinstalação de todas as dependências usando esse novo prefixo. Você pode usar --install-optionvárias vezes para adicionar qualquer uma das opções com as quais você pode usar python setup.py install( --prefixprovavelmente é o que você deseja, mas há muito mais opções que você pode usar).

Ian Bicking
fonte
5
se você fizer isso, existe uma maneira pip freezede ver o diretório alternativo?
Russ
7
O pip freeze olha no caminho; portanto, se você quiser algo assim PYTHONPATH=$PREFIX_PATH/lib/python2.6/site-packages pip freeze, deve vê-los.
Ian Bicking #
4
O uso --prefix=$PREFIX_PATHnão parece ter controle total do diretório de instalação, pois há um sufixo específico do sistema anexado a ele ( \Lib\site-packagesno Windows, por exemplo). Existe uma maneira de especificar um diretório específico?
Piotr Dobrogost
1
@ Piotr: sim, há a minha resposta. O uso de '--prefix' é um pouco grosseiro, mas funciona bem se você deseja que seu python puro vá para /usr/lib/pythonX.Y/site-packages em vez de /usr/local/local/lib/pythonX.Y/site- pacotes.
Anthon
80
Não é uma resposta ruim há 4 anos, mas a opção --target existe agora.
precisa saber é o seguinte
545

A opção --target é o que você procura:

pip install --target=d:\somewhere\other\than\the\default package_name

Mas você ainda precisa adicionar d:\somewhere\other\than\the\defaultpara PYTHONPATHrealmente usá-los a partir desse local.

-t, --target <dir>
Instala pacotes no <dir>. Por padrão, isso não substitui os arquivos / pastas existentes em <dir>.
Use --upgrade para substituir pacotes existentes no <dir> por novas versões.


Atualize o pip se o switch de destino não estiver disponível:

No Linux ou OS X:

pip install -U pip

No Windows (isso funciona em um problema ):

python -m pip install -U pip
Janusz Skonieczny
fonte
8
@DanH run pip install --upgrade pip!
precisa
16
Esta é a resposta verdadeira, apenas a opção foi adicionada um pouco após a resposta aceita.
bukzor
5
Qual é a diferença entre --install-option="--prefix=$PREFIX_PATH"mencionada por @Ian Bicking e a --target=$PATHopção?
precisa saber é o seguinte
6
targeté uma opção de pip e tudo o que você colocar install-optionserá passado para o setup.py install command. Basicamente, targeté a localização de pacotes de sites personalizados.
Janusz Skonieczny
10
O uso --targetpode resultar em uma instalação parcial, pois não instalará nenhum arquivo de scripts / dados incluindo no prefixo especificado. Parece que passar --prefixcom --install-optioné a única maneira adequada de ter controle total sobre o prefixo das instalações usadas.
precisa saber é o seguinte
74

Em vez da --targetopção ou do--install-options opção, descobri que o seguinte funciona bem (da discussão de um bug relacionado a isso em https://github.com/pypa/pip/issues/446 ):

PYTHONUSERBASE=/path/to/install/to pip install --user

(Ou defina o PYTHONUSERBASEdiretório em seu ambiente antes de executar o comando, usando export PYTHONUSERBASE=/path/to/install/to)

Isso usa a --useropção muito útil, mas diz para fazer obin , lib, sharee outros diretórios que você esperaria em um prefixo personalizado em vez de $HOME/.local.

Então você pode adicionar isso ao seu PATH , PYTHONPATHe outras variáveis, como faria um diretório de instalação normal.

Observe que você também pode precisar especificar o --upgradee--ignore-installed opções se algum pacote do qual isso depende exigir a instalação de versões mais recentes no PYTHONUSERBASEdiretório, para substituir as versões fornecidas pelo sistema.

Um exemplo completo:

PYTHONUSERBASE=/opt/mysterypackage-1.0/python-deps pip install --user --upgrade numpy scipy

..para instalar as versões mais recentes scipye numpyempacotadas em um diretório que você pode incluir no seuPYTHONPATH como quiser (usando o bash e o python 2.6 no CentOS 6 para este exemplo):

export PYTHONPATH=/opt/mysterypackage-1.0/python-deps/lib64/python2.6/site-packages:$PYTHONPATH
export PATH=/opt/mysterypackage-1.0/python-deps/bin:$PATH

Usar o virtualenv ainda é uma solução melhor e mais limpa!

David Gardner
fonte
4
Isso funcionou com o Travis CI em execução nos contêineres do Docker, enquanto a solução --install-option = "- prefix = $ PREFIX_PATH" não funcionou.
32bits
1
Noobie question, quão importante é a /binpasta que o pip cria, --usercria como faz, --PREFIXenquanto --targetnão.
Jonathan
1
Se o pacote estiver instalado no Python global, --ignore-installedé necessário.
George Sovetov
1
Esta opção também é compatível com --editablee instalações locais.
Mdh
1
Essa opção é útil para instalar pacotes como superusuário para outro usuário não root sem precisar andar por suaí (o que pode ser problemático em contêineres, por exemplo).
mdh 27/02
43

A instalação de um pacote Python geralmente inclui apenas alguns arquivos Python puros. Se o pacote incluir dados, scripts e / ou executáveis, eles serão instalados em diretórios diferentes dos arquivos Python puros.

Supondo que seu pacote não possua dados / scripts / executáveis ​​e que você queira que seus arquivos Python entrem /python/packages/package_name(e não em algum subdiretório alguns níveis abaixo, /python/packagescomo no uso --prefix), você pode usar o comando one time:

pip install --install-option="--install-purelib=/python/packages" package_name

Se você deseja que todos (ou a maioria) de seus pacotes cheguem lá, você pode editar seu ~/.pip/pip.confpara incluir:

[install]
install-option=--install-purelib=/python/packages

Dessa forma, você não pode esquecer a necessidade de especificá-lo repetidamente.

Quaisquer arquivos executáveis ​​/ dados / scripts incluídos no pacote ainda irão para seus locais padrão, a menos que você especifique opções adicionais de instalação ( --prefix/ --install-data/ --install-scripts, etc., para obter detalhes, veja as opções de instalação personalizadas ).

Anthon
fonte
1
Uma grande vantagem para o arquivo de configuração. Pessoalmente, eu especifiquei --prefixlá, porque tenho um diretório "local" em um servidor compartilhado no diretório inicial e ele foi usado como o prefixo easy_installantes de mudar para pip. Sistema $PATHe $PYTHONPATHforam configurados antes. Em vez de install-option=--install-purelib=/blahexistir esta target=/blahopção / opção mais recente . Também é bom, mas às vezes você precisa apenas de um substituto para --prefixusar com setup.pyou easy_install.
Tomasz Gandor
18

Parece que ninguém mencionou a opção -t, mas a mais fácil:

pip install -t <direct directory> <package>
Erwan
fonte
8
A -topção é a versão curta da --targetopção que tem sido descrito em outra resposta ( stackoverflow.com/a/19404371/594053 ) :)
MattiSG
14

Basta adicionar um ponto à resposta de @Ian Bicking:

Usar a --useropção para especificar o diretório instalado também funciona se alguém quiser instalar algum pacote Python no diretório pessoal (sem o usuário sudo certo) no servidor remoto.

Por exemplo,

pip install --user python-memcached

O comando instalará o pacote em um dos diretórios listados em seu PYTHONPATH.

Boa vontade
fonte
14

Testou estas opções com python3.5 e pip 9.0.3:

pip install --target / myfolder [pacotes]

Instala TODOS os pacotes, incluindo dependências em / myfolder. Não leva em conta que pacotes dependentes já estão instalados em outro lugar no Python. Você encontrará pacotes em / myfolder / [package_name]. Caso você tenha várias versões do Python, isso não leva isso em consideração (nenhuma versão do Python no nome da pasta do pacote).

pip install --prefix / myfolder [pacotes]

Cheques são dependências já instaladas. Instalará pacotes no /myfolder/lib/python3.5/site-packages/[packages]

pip install --root / myfolder [pacotes]

Verifica dependências como --prefix, mas o local da instalação será /myfolder/usr/local/lib/python3.5/site-packages/[package_name].

pip install --user [pacotes]

Irá instalar pacotes no $ HOME: /home/[USER.la/.local/lib/python3.5/site-packages O Python pesquisa automaticamente a partir desse caminho .local, para que você não precise colocá-lo no seu PYTHONPATH.

=> Na maioria dos casos --user é a melhor opção para usar. Caso a pasta inicial não possa ser usada por algum motivo, --prefixo.

Mikko
fonte
Executando no python 2.7.16, --target (ou --prefix) instala o Jinja2-2.10.1.dist-info / por exemplo, enquanto install --install-option = "- prefix instala o Jinja2-2.10.1-py2 .7.egg-info /, que é o que eu realmente queria
Greg Dougherty
13

As versões mais recentes do pip(8 ou posterior) podem usar diretamente a --prefixopção :

pip install --prefix=$PREFIX_PATH package_name

onde $PREFIX_PATHé o prefixo de instalação em que lib, bin e outras pastas de nível superior são colocadas.

Mike T
fonte
10
pip install packageName -t pathOfDirectory

ou

pip install packageName --target pathOfDirectorty
kundan kaushik
fonte
4

Para adicionar o conselho já bom, como tive um problema ao instalar o IPython quando não tinha permissão de gravação /usr/local.

O pip usa distutils para fazer sua instalação e este tópico discute como isso pode causar um problema, pois depende dosys.prefix configuração.

Meu problema ocorreu quando a instalação do IPython tentou gravar em '/ usr / local / share / man / man1' com a permissão negada . Como a instalação falhou, não pareceu gravar os arquivos IPython no diretório bin.

Usando "--user" funcionou e os arquivos foram gravados em ~ / .local. Adicionar ~ / .local / bin ao $ PATH significa que eu poderia usar o "ipython" a partir daí.

No entanto, estou tentando instalar isso para vários usuários e recebi permissão de gravação no /usr/local/lib/python2.7diretório. Eu criei um diretório "bin" lá e defina diretivas para distutils:

vim ~/.pydistutils.cfg

[install]
install-data=/usr/local/lib/python2.7
install-scripts=/usr/local/lib/python2.7/bin

then ( -Ié usado para forçar a instalação apesar das falhas anteriores / instalação .local):

pip install -I ipython

Então eu adicionei /usr/local/lib/python2.7/bina $PATH.

Pensei em incluir isso no caso de alguém ter problemas semelhantes em uma máquina à qual não tem acesso ao sudo.

Stuart Brock
fonte
2

Se você estiver usando o brew com python, infelizmente, o pip / pip3 é enviado com opções muito limitadas. Você não possui as opções --install-option, --target, --user, conforme mencionado acima.

Nota sobre o pip install --user
O pip install normal --user está desabilitado para o Python fabricado. Isso ocorre devido a um erro no distutils, porque o Homebrew escreve um distutils.cfg que define o prefixo do pacote. Uma possível solução alternativa (que coloca scripts executáveis ​​em ~ / Library / Python /./ bin) é: python -m pip install --user --install-option="--prefix=" <package-name>

Você pode achar essa linha muito complicada. Sugiro usar pyenv para gerenciamento. Se você estiver usando

brew upgrade python python3

Ironicamente, você está na verdade rebaixando a funcionalidade do pip.

(Eu posto esta resposta, simplesmente porque o pip no meu mac osx não tem a opção --target e passei horas corrigindo-a)

anônimo
fonte
Esta resposta com um prefixo explícito e, ignore-installeddevido a esforços anteriores, funcionou para mim:python -m pip install --user --install-option="--prefix='/myFunkyApp/lib'" --ignore-installed <package-name>
Jeremy Jones
0

Com o pip v1.5.6on Python v2.7.3(GNU / Linux), a opção --rootpermite especificar um prefixo de instalação global (aparentemente) independentemente das opções específicas do pacote. Tente fi,

$ pip install --root=/alternative/prefix/path package_name
sphakka
fonte
0

Sugiro seguir a documentação e criar o arquivo ~ / .pip / pip.conf. Observe na documentação que está faltando o diretório de cabeçalho especificado, o que leva ao seguinte erro:

error: install-base or install-platbase supplied, but installation scheme is incomplete

O conteúdo completo do arquivo conf é:

[install]
install-base=$HOME
install-purelib=python/lib
install-platlib=python/lib.$PLAT
install-scripts=python/scripts
install-headers=python/include
install-data=python/data

Infelizmente, eu posso instalar, mas quando tenta desinstalar o pip, diz-me que não existe esse pacote para o processo de desinstalação ... então algo ainda está errado, mas o pacote vai para o local predefinido.

kensai
fonte
0

pip install /path/to/package/

agora é possível.

A diferença disso e usar o sinalizador -eou --editableé que os -elinks para onde o pacote está salvo (por exemplo, sua pasta de downloads), em vez de instalá-lo no seu caminho python.

Isso significa que, se você excluir / mover o pacote para outra pasta, não poderá usá-lo.

AH
fonte
isso não responde à pergunta
Clintm