virtualenv --no-site-packages e pip ainda encontra pacotes globais?

136

Fiquei com a impressão de que virtualenv --no-site-packages criaria um ambiente Python completamente separado e isolado, mas não parece.

Por exemplo, eu tenho o python-django instalado globalmente, mas desejo criar um virtualenv com uma versão diferente do Django.

$ virtualenv --no-site-packages foo       
New python executable in foo/bin/python
Installing setuptools............done.
$ pip -E foo install Django
Requirement already satisfied: Django in /usr/share/pyshared
Installing collected packages: Django
Successfully installed Django

Pelo que sei, o pip -E foo installacima exposto deve reinstalar uma nova versão do Django. Além disso, se eu disser ao pip para congelar o ambiente, recebo muitos pacotes. Eu esperaria que para um ambiente fresco com --no-site-packagesisso ficaria em branco?

$ pip -E foo freeze
4Suite-XML==1.0.2
BeautifulSoup==3.1.0.1
Brlapi==0.5.3
BzrTools==1.17.0
Django==1.1
... and so on ...

Estou entendendo mal como --no-site-packagesdeve funcionar?

ianw
fonte
4
Para sua informação, --no-site-packages ficou obsoleto. Veja aqui
Salem Ben Mabrouk
@SalemBenMabrouk Link quebrado, novo link aqui. Problema relacionado no Github: O sinalizador '--no-site-packages' desapareceu recentemente?
Ynjxsjmh 13/03
Nesse link, ele diz que --no-site-packagesDEPRECATED. Retido apenas para compatibilidade com versões anteriores. Não ter acesso aos pacotes globais de sites agora é o comportamento padrão . Se você quiser acessar pacotes globais de sites, poderá ativar --system-site-packages.
Ynjxsjmh 13/03

Respostas:

107

Eu tive um problema como esse, até perceber que (muito antes de descobrir o virtualenv), adicionei diretórios ao PYTHONPATH no meu arquivo .bashrc. Como já fazia mais de um ano, não pensei nisso imediatamente.

wobbily_col
fonte
12
Meu heroi! Se você quiser apenas verificar se esse é o seu problema rapidamente, execute o printenv para verificar se o PYTHONPATH está presente e, se estiver, execute o PYTHONPATH não configurado. Você ainda precisará rastrear o problema se não quiser mais que o problema apareça, mas isso permitirá que você instale um novo virtualenv na sessão atual do shell.
UltraBob
Homebrew faz isso também!
Rob
1
Eu gostaria de poder te votar mais. Eu vim a esta página mais de uma vez depois de encontrar coisas que eram por causa do meu PYTHONPATH já estar definido.
Bemmu 07/07/2015
Sei que este é um post muito (muito) antigo, mas pesquisei em todos os lugares, inclusive fazendo algumas de minhas próprias perguntas sobre SO, e não consigo descobrir como chegar --no-site-packagesao trabalho. Estou chegando perto de apenas limpar o ubuntu e ver se isso corrige as coisas. Inicialmente, pensei que estava tendo o mesmo problema de PYTHONPATH, mas durante a execução printenvnão o vejo. A frustração está aumentando, e qualquer ajuda é muito apreciada. Meu sys.path de dentro de um venv criado com --no-site-packagesparece incluir todos os meus diretórios de pacotes. Eu não tenho a menor idéia de como modificar isso. Socorro?
NotAnAmbiTurner
Isso também pode se aplicar à sua PATHvariável global se você estiver encontrando executáveis ​​de fora do virtualenv também.
Enderland 22/03
27

Você precisa ter certeza de que está executando o pipbinário no ambiente virtual que criou, não no global.

env/bin/pip freeze

Veja um teste:

Criamos o virtualenv com a --no-site-packagesopção:

$ virtualenv --no-site-packages -p /usr/local/bin/python mytest
Running virtualenv with interpreter /usr/local/bin/python
New python executable in mytest/bin/python
Installing setuptools, pip, wheel...done.

Verificamos a saída do freezerecém-criado pip:

$ mytest/bin/pip freeze
argparse==1.3.0
wheel==0.24.0

Mas se usarmos o global pip, é isso que obtemos:

$ pip freeze
...
pyxdg==0.25
...
range==1.0.0
...
virtualenv==13.1.2

Ou seja, todos os pacotes que pipforam instalados em todo o sistema. Ao verificar which pip, obtemos (pelo menos no meu caso) algo como /usr/local/bin/pip, o que significa que, quando o fazemos pip freeze, chama isso de binário em vez de mytest/bin/pip.

fedorqui 'Então pare de prejudicar'
fonte
Eu tive o mesmo problema. Eu me pergunto como isso aconteceu, já que na primeira congelamento chamada pip me mostrar os pacotes corretos, mas um par de dias mais tarde, começou a chamar o localizado em / usr / / bin local / ...
jimijazz
1
Esse era o problema para mim: eu tinha um alias pippara um caminho específico para o pip global, que não estava sendo substituído durante a ativação do virtualenv.
merlinND
1
Você acabou de me salvar, isso funcionou bem para mim (pip3 e python3.7) Obrigado
Saed Yousef
24

Eventualmente, descobri que, por qualquer motivo, pip -E não estava funcionando. No entanto, se eu realmente ativar o virtualenv e usar o easy_install fornecido pelo virtualenv para instalar o pip, use o pip diretamente de dentro, ele parece funcionar conforme o esperado e mostra apenas os pacotes no virtualenv

ianw
fonte
2
FWIW, com as versões de tronco atuais do pip e do virtualenv, seu fluxo de trabalho original agora faz a coisa certa, para mim de qualquer maneira. Dito isto, eu pessoalmente ainda evito -E e apenas instalo o pip em cada virtualenv.
26630 Carl Meyer
17

Sei que essa é uma pergunta muito antiga, mas para quem chega aqui procurando uma solução:

Não se esqueça de ativar o virtualenv ( source bin/activate) antes de executar pip freeze. Caso contrário, você obterá uma lista de todos os pacotes globais.

aleta
fonte
Muito obrigado por isso, eu sabia que tinha que usar fonte com virtualenv, mas não para virtualenvwrapper e nunca ouvi falar de congelamento de pip. Obrigado novamente
Deepend
RESPOSTA CORRETA. após a inicialização virtualenv você deve ativá-lo ou você estará usando a versão do sistema de python
AsAP_Sherb
16

Limpe temporariamente o PYTHONPATHcom:

export PYTHONPATH=

Em seguida, crie e ative o ambiente virtual:

virtualenv foo
. foo/bin/activate

Apenas então:

pip freeze
Pedro Torres
fonte
15

--no-site-packagesComo o nome sugere, remova o diretório padrão de pacotes de sites sys.path. Qualquer outra coisa que viva no caminho padrão do Python permanecerá lá.

Martin v. Löwis
fonte
1
Para mim limpar o meu PYTHONPATHcom export PYTHONPATH=parecia fazer o truque.
usar o seguinte código
4

Um problema semelhante pode ocorrer no Windows, se você chamar scripts diretamente, script.pye usar o abridor padrão do Windows e abrir o Python fora do ambiente virtual. A chamada com python script.pyele usará o Python com o ambiente virtual.

odie5533
fonte
Deve haver uma linha shebang na parte superior do script (começando com '! #') Que apontará para o interpretado a ser usado.
Wbp_Globo # 5/15
2

Isso também parece acontecer quando você move o diretório virtualenv para outro diretório (no linux) ou renomeia um diretório pai.

pors
fonte
1

Eu estava tendo o mesmo problema. O problema para mim (no Ubuntu) era que o nome do meu caminho continha $. Quando criei um virtualenv fora do $ dir, ele funcionou bem.

Esquisito.

NotAnAmbiTurner
fonte
1

Um dos possíveis motivos pelos quais o virtualenv pip não funcionará é se alguma das pastas pai tiver espaço em seu nome /Documents/project name/app renomeando-o para /Documents/projectName/appresolver o problema.

mabdrabo
fonte
1

Eu vim através do mesmo problema em que o pip in venv ainda funciona como o pip global.
Depois de pesquisar muitas páginas, eu descobri dessa maneira.
1. Crie um novo venv by virtualenv com a opção "--no-site-packages"

virtualenv --no-site-packages --python=/xx/xx/bin/python my_env_nmae

observe que, embora a opção "--no-site-packages" seja o padrão verdadeiro desde 1.7.0 no arquivo doc do virtualenv, mas achei que ele não funcionava, a menos que você o ativasse manualmente. Para obter um venv puro, sugiro ativar esta opção 2. Ative o novo ambiente que você criou

source ./my_env_name/bin/activate
  1. Verifique sua localização de pip e python e verifique se esses dois comandos estão em ambiente virtual
pip --version
which python
  1. Use pip sob ambiente virtual para instalar pacotes livres da interupção de pacotes globais
pip install package_name

Gostaria que esta resposta o ajudasse!

augustus
fonte
0

Aqui está a lista de todas as opções de instalação do pip - não encontrei nenhuma -Eopção ' ', pode ser a versão mais antiga. Abaixo, estou compartilhando um uso simples do inglês e trabalhando virtualenvpara os futuros usuários de SO.


Tudo parece bem, aceite ativar o virtualenv(foo ). Tudo o que faz é permitir que tenhamos um ambiente python múltiplo (e variável), ou seja, várias versões Python, ou várias versões do Django ou qualquer outro pacote Python - caso tenhamos uma versão anterior em produção e desejemos testar a versão mais recente do Django com nosso inscrição.

Em suma, criar e usar (ativar) o ambiente virtual ( virtualenv) possibilita executar ou testar nosso aplicativo ou scripts python simples com diferentes interpretadores Python, por exemplo, Python 2.7 e 3.3 - pode ser uma instalação nova (usando a --no-site-packagesopção) ou todos os pacotes dos existentes / última configuração (usando a --system-site-packagesopção). Para usá-lo, temos que ativá-lo:

$ pip install djangoirá instalá-lo nos pacotes globais de sites e, da mesma forma, obter os pip freezenomes dos pacotes globais de sites.

enquanto dentro do venv dir (foo) a execução $ source /bin/activateativará o venv, ou seja, agora qualquer coisa instalada com o pip será instalada apenas no ambiente virtual e somente agora o pip freeze não fornecerá a lista dos pacotes python globais de pacotes de sites. Uma vez ativado:

$ virtualenv --no-site-packages foo       
New python executable in foo/bin/python
Installing setuptools............done.
$ cd foo
$ source bin/activate 
(foo)$ pip install django

(foo)antes que o $sinal indique que estamos usando um ambiente virtual em python, ou seja, qualquer coisa com pip-install, freeze, uninstall será limitada a esse venv e não terá efeito na instalação / pacotes globais / padrão do Python.

Nabeel Ahmed
fonte