Como faço para adicionar um caminho para PYTHONPATH no virtualenv

97

Estou tentando adicionar um caminho para a variável de ambiente PYTHONPATH, que só seria visível em um ambiente virtualenv específico.

Tentei SET PYTHONPATH=...em um prompt de comando virtualenv, mas isso define a variável para todo o ambiente.

Como faço para conseguir isso?

Flavien
fonte

Respostas:

155

Normalmente, você pode evitar ter que fazer qualquer coisa com PYTHONPATH usando .ptharquivos . Basta colocar um arquivo com uma extensão .pth (qualquer nome de base funciona) na pasta de pacotes do site do virtualenv, por exemplo lib\python2.7\site-packages, com o caminho absoluto para o diretório que contém seu pacote como seu único conteúdo.

Dougal
fonte
Infelizmente, isso não funciona como uma substituição. Ele anexa o caminho, portanto, se você estiver desenvolvendo, não funcionará.
Erik Aronesty
Além disso, se você conhece o caminho absoluto, qual é o objetivo de uma variável?
Jamie Marshall
você também pode navegar até a pasta de pacotes de sites do seu ambiente virtual e criar um link simbólico para o arquivo .pth como este: ln -s path / to / somfile.pth. Achei isso útil quando precisava que o mesmo diretório fosse acessível em vários ambientes virtuais
Data-phile
91

Se estiver usando virtualenv, provavelmente também deve usar o virtualenvwrapper ; nesse caso, você pode usar o comando add2virtualenv para adicionar caminhos para o caminho Python para o virtualenv atual:

add2virtualenv directory1 directory2 …

crimeminister
fonte
3
Que tal remover do virtualenv?
silverdagger
1
Eu quero adicionar um comentário amigável que em hosts compartilhados e situações semelhantes, o envoltório de venv não é desejado. Nesses casos, um venv está em vigor e tudo o que é necessário para fazer a instalação adicional não é desejado. Localmente as coisas são diferentes, mas no servidor / imagem o KISS é muito importante.
Marc
2
Não tenho certeza de como o comando funcionava quando isso foi escrito, mas add2virtualenvnão modifica $ PYTHONPATH, em vez disso, modifica sys.path.
ForeverWintr
1
@ajostergaard: Desculpe, deveria ter fornecido uma fonte. Se você olhar o código-fonte de add2virtualenv, você pode ver que ele está modificando sys.path. Concordo que a documentação parece que modifica a PYTHONPATHvariável de ambiente, mas isso parece estar incorreto. bitbucket.org/virtualenvwrapper/virtualenvwrapper/src/…
ForeverWintr
1
@ForeverWintr Estou corrigido - arquivos .pth são usados ​​para configurar sys.path. docs.python.org/2/library/site.html Confused.com!
ostergaard
5

Você também pode tentar colocar um link simbólico para um de seus virtuaisenv.

por exemplo. 1) ative seu virtualenv 2) execute python 3) import sys e verifique sys.path 4) você encontrará o caminho de pesquisa do python lá. Escolha um desses (por exemplo, pacotes do site) 5) vá lá e crie um link simbólico para o seu pacote como: ln -s caminho para o nome do seu pacote com o qual você estará importando

Dessa forma, você poderá importá-lo mesmo sem ativar seu virtualenv. Simplesmente tente: path-to-your-virtualenv-folder / bin / python e importe seu pacote.

Slavko-t
fonte
Eu acho que essa votação foi negada por usar links simbólicos em vez de arquivos .pth. Funcionou para mim, então, seja o que for.
Gareth Davidson
3

Se você estiver usando o virtualenvwrapper,

$ cd to the parent folder
$ add2virtualenv  folder_to_add

o console exibirá

Warning: Converting "folder_to_add" to "/absoutle/path/to/folder_to_add"

É isso, e você deve estar pronto para ir

Aneesh Panoli
fonte
1
import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print("current working dir: %s" % dir_path)

sys.path.insert(0, dir_path)

Eu sugiro fortemente que você use o virtualenv e o virtualenvwrapper para evitar bagunçar o caminho.

Pato de borracha
fonte
se você quiser que isso funcione com qualquer versão do python, apenas use um formato de string no estilo antigo normal ao invés da fantasia f-string f "... {dir_path}"
Guillaume S
Obrigado pelo comentário. Eu revisei para uso. os métodos antigos são complicados e idiossincráticos e não há nada sofisticado em um sistema de modelos simples
Rubber Duck
Tudo é relativo :)
Guillaume S