É possível determinar se o script atual está sendo executado dentro de um ambiente virtualenv?
python
virtualenv
miracle2k
fonte
fonte
Respostas:
AFAIK, a maneira mais confiável de verificar isso (e a maneira usada internamente no virtualenv e no pip) é verificar a existência de
sys.real_prefix
:Dentro de um virtualenv,
sys.prefix
aponta para o diretório virtualenv, esys.real_prefix
aponta para o prefixo "real" do sistema Python (muitas vezes/usr
ou/usr/local
ou algo assim).Fora de um virtualenv,
sys.real_prefix
não deveria existir.O uso da
VIRTUAL_ENV
variável de ambiente não é confiável. Ele é definido peloactivate
script de shell virtualenv , mas um virtualenv pode ser usado sem ativação, executando diretamente um executável do diretório virtualenvbin/
(ouScripts
), caso em que$VIRTUAL_ENV
não será definido.fonte
PYTHON_ENV=$(python -c "import sys; sys.stdout.write('1') if hasattr(sys, 'real_prefix') else sys.stdout.write('0')")
Tente usar
pip -V
(aviso capital V)Se você estiver executando o ambiente virtual. mostrará o caminho para a localização do ambiente.
fonte
virtualenv
muito sua situação, é possível que isso possa falhar ou mentir para você. Se está mentindo, você pode fazerfind /path/to/venv/ -type f -exec sed -ie "s:/old/path/to/venv:/path/to/venv:g" {} \+
. Se estiver falhando (recebi "dados de marechal incorretos"), você precisará limpar os arquivos .pyc comfind /path/to/venv -type f -name "*.pyc" -exec rm {} \+
(não se preocupe, eles serão reconstruídos automaticamente)....\lib\site-packages
no%PATH%
. Portanto, ele retornará um falso positivo nesse caso.Esta é uma melhoria da resposta aceita por Carl Meyer . Ele funciona com virtualenv para Python 3 e 2 e também para o módulo venv no Python 3:
A verificação de
sys.real_prefix
covers virtualenv, a igualdade de não-vaziosys.base_prefix
comsys.prefix
covers venv.Considere um script que usa a função assim:
E a seguinte invocação:
fonte
def is_venv(): return hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefix
. Apenas dizendo'.pipenv
ambientes virtuais criados.Verifique a
$VIRTUAL_ENV
variável de ambiente.A
$VIRTUAL_ENV
variável de ambiente contém o diretório do ambiente virtual quando em um ambiente virtual ativo.Depois de executar
deactivate
/ sair do ambiente virtual, a$VIRTUAL_ENV
variável será limpa / vazia. Python irá gerar umKeyError
porque a variável de ambiente não está definida.Naturalmente, essas mesmas verificações de variáveis de ambiente também podem ser feitas fora do script Python, no shell.
fonte
virtualenv
virtualenv e umvenv
virtualenv.De acordo com o virtualenv pep em http://www.python.org/dev/peps/pep-0405/#specification, você pode usar o sys.prefix em vez do os.environ ['VIRTUAL_ENV'].
o sys.real_prefix não existe no meu virtualenv e o mesmo no sys.base_prefix.
fonte
sys.real_prefix
.env |grep VIRTUAL_ENV |wc -l
que retornará 1 se estiver em um venv ou 0 se não estiver.[[ -n $VIRTUAL_ENV ]] && echo virtualenv
ou[[ -z $VIRTUAL_ENV ]] && echo not virtualenv
dependendo de suas necessidades.Para verificar se o seu Virtualenv interno:
Você também pode obter mais dados sobre o seu ambiente:
fonte
Existem várias boas respostas aqui e outras menos robustas. Aqui está uma visão geral.
Como não fazer isso
Não confie na localização do Python ou na
site-packages
pasta.Se eles estiverem configurados para locais fora do padrão, isso não significa que você esteja realmente em um ambiente virtual. Os usuários podem ter mais de uma versão do Python instalada, e essas nem sempre são as que você espera.
Evite olhar para:
sys.executable
sys.prefix
pip -V
which python
Além disso, não verificar a presença de
venv
,.venv
ouenvs
em qualquer um desses caminhos. Isso ocorrerá em ambientes com um local mais exclusivo. Por exemplo, o Pipenv usa valores de hash como o nome para seus ambientes.VIRTUAL_ENV
variável de ambienteAmbos
virtualenv
evenv
defina a variável de ambiente$VIRTUAL_ENV
ao ativar um ambiente. Veja PEP 405 .Você pode ler essa variável em scripts de shell ou usar esse código Python para determinar se está definido.
O problema é que isso só funciona quando o ambiente é ativado pelo
activate
script de shell.Você pode iniciar os scripts do ambiente sem ativar o ambiente ; portanto, se isso for uma preocupação, você precisará usar um método diferente.
sys.base_prefix
virtualenv
,venv
Epyvenv
pontosys.prefix
para o Python instalado dentro do virtualenv como seria de esperar.Ao mesmo tempo, o valor original de
sys.prefix
também é disponibilizado comosys.base_prefix
.Podemos usar isso para detectar se estamos em um virtualenv.
Cair pra trás:
sys.real_prefix
Agora, tenha cuidado,
virtualenv
antes da versão 20 não ter sido definida,sys.base_prefix
massys.real_prefix
sim.Para estar seguro, marque os dois conforme sugerido na resposta da hroncok :
Anaconda
Se você estiver usando ambientes virtuais do Anaconda, verifique a resposta de Victoria Stuart .
fonte
running_in_virtualenv = sys.*base_*prefix != sys.prefix
if hasattr(sys, 'real_prefix'):
teste, que não funcionava mais.Você pode fazer
which python
e ver se está apontando para o ambiente virtual.fonte
which
não está disponível por padrão no Windows. Emwhere
vez disso, você pode usar no Windows ou empregar artesanato . Ou olhesys.executable
. Mas, ainda assim, existem métodos melhores.Uso rotineiramente vários ambientes virtuais instalados pelo Anaconda (venv). Este trecho de código / exemplos permite determinar se você está ou não em um venv (ou no ambiente do sistema) e também exige um venv específico para o seu script.
Adicione ao script Python (trecho de código):
Exemplo:
Atualização 1 - use em scripts bash:
Você também pode usar essa abordagem em scripts bash (por exemplo, aqueles que devem ser executados em um ambiente virtual específico). Exemplo (adicionado ao script bash):
Atualização 2 [novembro de 2019]
Desde o meu post original, mudei de Anaconda venv (e o próprio Python evoluiu ambientes virtuais viz-a-viz ).
Reexaminando esse problema, eis alguns códigos Python atualizados que você pode inserir para testar se está operando em um ambiente virtual Python específico (venv).
Aqui está um código explicativo.
fonte
A maneira mais fácil é simplesmente executar
which python
:, se você estiver em um virtualenv, ele apontará para o python em vez do globalfonte
(editada) Encontrei assim, o que você acha disso? (ele também retorna o caminho base venv e funciona mesmo para readthedocs onde a verificação da variável env não):
fonte
Já existem muitos ótimos métodos publicados aqui, mas apenas adicionamos mais um:
informa onde
pip
os pacotes foram instalados.fonte
site.getsitepackages()
gerar um diretório que não seja o sistema, você poderá deduzir que está em um ambiente virtual.virtualenv
.venv
você está usando.Não é à prova de balas, mas para ambientes UNIX, teste simples como
funciona muito bem para mim. É mais simples do que testar os atributos existentes e, de qualquer forma, você deve nomear seu diretório venv
venv
.fonte
No sistema operacional Windows, você vê algo assim:
Parênteses significam que você está realmente no ambiente virtual chamado "virtualEnvName".
fonte
Uma solução potencial é:
No meu caso, eu realmente só queria detectar se poderia instalar itens com o pip como está. Embora possa não ser a solução certa para todos os casos, considere simplesmente verificar se você possui permissões de gravação para o local do executável do Python.
Nota: isso funciona em todas as versões do Python, mas também retorna
True
se você executar o sistema com o Pythonsudo
. Aqui está um caso de uso potencial:fonte
Esta é uma pergunta antiga, mas muitos exemplos acima são muito complicados.
Mantenha as coisas simples: (no terminal Jupyter Notebook ou Python 3.7.1 no Windows 10)
fonte
envs
desse caminho, isso parará de funcionar quando você passar do anaconda paravirtualenv
oupipenv
.