Faça o virtualenv herdar pacotes específicos de seus pacotes de sites globais


208

Estou procurando uma maneira de criar um virtualenv que conterá apenas algumas bibliotecas (que eu escolhi) da instalação do python base.

Para ser mais concreto, estou tentando importar meu matplotlib para o virtualenv durante a criação do virtualenv. Ele não pode ser instalado eficientemente com o pip ou o easy_install, pois falta algumas bibliotecas do compilador fortran. O jeito que eu fiz até agora era copiar manualmente de

/usr/lib/python2.7/dist-packages/ to virtualenv_name/lib/python2.7/dist-packages/

no entanto, isso impede que os links importados manualmente sejam registrados pelo yolk (que imprime todas as bibliotecas atualmente disponíveis no virtualenv).

Portanto, existe uma maneira de fazer uma variante seletiva do

virtualenv --system-site-packages

16
um lembrete gentil - selecione uma resposta se uma das opções abaixo parecer funcionar.
Foobarbecue

1
parece que 12 pessoas testaram para você nos últimos meses ...
foobarbecue

2
Por que incomodar o OP? Todos nós podemos ver qual é a resposta mais popular; realmente importa se ele aceita? Eu acho que sua integridade em testar por si mesmo, em vez de simplesmente marcar a resposta mais popular, deve ser admirada.
Michael Scheper

5
2013: as pontuações entre respostas corretas e incorretas são bastante semelhantes. OP diz que ele vai testar. 2016: Michael Scheper está tão impressionado que a OP (três anos atrás) disse que iria testar. 2017: Me deparei com essa pergunta novamente e me divirto.
foobarbecue

2
Não há resposta correta. O OP pediu seletivo --system-site-packages. As respostas sugerem o uso não seletivo --system-site-packagese a instalação excessiva de alguns pacotes localmente, o que é diferente e tem implicações diferentes.
Piotr Jurkiewicz 18/05/19

Respostas:


238

Crie o ambiente com virtualenv --system-site-packages. Em seguida, ative o virtualenv e, quando quiser, coisas instaladas no virtualenv, e não no python do sistema, use pip install --ignore-installedou pip install -I. Dessa forma, o pip instalará o que você solicitou localmente, mesmo que exista uma versão do sistema. Seu interpretador python procurará primeiro no diretório de pacotes do virtualenv, portanto esses pacotes devem sombrear os globais.


45
Ao usar -I, você sempre reinstalará os pacotes, mesmo que eles já existam no diretório de pacotes de sites em todo o sistema. Se você usar -U, ele instalará versões mais recentes dos pacotes no seu virtualenv, mas não reinstalará nenhum pacote que já esteja disponível no sistema com a versão necessária.
Danilo Bargen 04/02

15
Você sabe se existe alguma maneira de 'ativar' a opção --system-site-packages em um ambiente virtual criado anteriormente? Gostaria de evitar o incômodo de reinstalar todos os meus pacotes locais!
Gabriel


Achei esta resposta muito interessante, no entanto, tive um caso muito estranho em que não funcionou. Eu tenho um virtualenv com no-global-site-packagesativado. Mas, por alguma razão, não sei se havia um pacote que estava sendo usado no sistema global. Usar pip install -Io pacote de dentro do virtualenv não funcionou. Finalmente, desinstalei temporariamente o pacote do virtualenv e do sistema global. Depois, instalei-o novamente no virtualenv e no sistema (nessa ordem). Então agora funciona bem.
precisa saber é o seguinte

3
-1 A pergunta pede para tornar certos pacotes visíveis, nem todos, exceto os pacotes sombreados. A lista branca de um conjunto limitado seria muito mais segura do que colocar tudo na lista branca, pois permite garantir que todos os pacotes devem existir no venv, exceto os explicitamente incluídos na lista branca.
bluenote10

19

Você pode usar --system-site-packagese, em seguida, "overinstall" o material específico para o seu virtualenv. Dessa forma, tudo o que você instala no seu virtualenv será retirado de lá, caso contrário, será retirado do seu sistema.


Não sei exatamente o que não está claro, mas tentarei: se você criar um virtualenv com a opção --system-site-packages, o sistema tentará primeiro encontrar pacotes no seu virtualenv, se não o encontrar lá, será tente encontrá-lo na instalação do sistema python. Somente se ele não o encontrar, ele aumentará e ImportError.
schacki

4
O único problema com essa abordagem é que agora você tem todas as bibliotecas do sistema. Onde você pode querer um controle muito rígido sobre o que está instalado.
Dwayne 31/05

7
O que não está claro é como isso é realmente possível! Se você instalar o myprog em um ambiente virtual criado com --system-site-packages onde o myprog existe no sistema, ele não "instalará" o myprog. Ele descobrirá que o myprog existe e dirá "Requisito já satisfeito". Então ... o que você quis dizer?
Foobarbecue 18/10/2013

-5

Instale o ambiente virtual com

virtualenv --system-site-packages

E use pip install -U to install matplotlib


3
É o oposto do que a pergunta foi feita.
Dan Getz

-7

Você pode usar virtualenv --clear. que não instala nenhum pacote, instale os que você deseja.


Isso não é uma resposta para a questão real sobre como fazer uso de alguns pacotes de todo o sistema
MrLeeh
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.