Adicionar permanentemente um diretório ao PYTHONPATH?

324

Sempre que eu uso sys.path.append , o novo diretório será adicionado. No entanto, quando eu fechar o python, a lista voltará aos valores anteriores (padrão?). Como adiciono permanentemente um diretório PYTHONPATH?

John Howard
fonte

Respostas:

135

Você precisa adicionar seu novo diretório à variável de ambiente PYTHONPATH, separada por dois pontos do conteúdo anterior. Em qualquer forma de Unix, você pode fazer isso em um script de inicialização apropriado para qualquer shell que esteja usando (.profile ou o que for, dependendo do seu shell favorito) com um comando que, novamente, depende do shell em questão; no Windows, você pode fazer isso através da GUI do sistema para esse fim.

superuser.com pode ser um lugar melhor para perguntar mais, ou seja, para obter mais detalhes, se você precisar de detalhes sobre como enriquecer uma variável de ambiente na plataforma e no shell escolhidos, já que não é realmente uma questão de programação em si.

Alex Martelli
fonte
8
Errata: o separador no Windows seria um ponto e vírgula. Se você precisar substituir os caminhos do sistema no Windows, a configuração via GUI como uma variável de ambiente do usuário pode não ser suficiente, pois as variáveis ​​do usuário são anexadas às variáveis ​​do sistema. Nesses casos, você precisará recorrer a um script de inicialização que faça os ajustes necessários.
Nathan Ernst
1
@ Nathan, TX para o lembrete em ponto e vírgula, mas (se você é um administrador, é claro), você pode definir env.vars do sistema no Windows (além disso, o OP não está perguntando como substituir o caminho, apenas como anexá -lo , portanto, um usuário env.var também será bom para isso! -).
precisa saber é o seguinte
infelizmente não sou administrador no meu PC de trabalho, por isso tenho que recorrer a essas medidas. :(
Nathan Ernst
439

Se você estiver usando o bash (em uma distribuição Mac ou GNU / Linux), adicione-o ao seu ~/.bashrc

export PYTHONPATH="${PYTHONPATH}:/my/other/path"
awesomo
fonte
28
Isso funcionou perfeitamente para mim, mas verifique se o diretório para o qual você aponta tem o arquivo init .py mais alto na sua estrutura de diretórios. Isso não estava perfeitamente claro para mim no começo. Por exemplo, tentei exportar PYTHONPATH = $ PYTHONPATH: / Users / joey / repos, mas não funcionou porque meu diretório de repositórios não tinha _ init_ .py. Indo mais um diretório: / Users / joey / repos / specificRepo fez o truque. Agora, o python pode percorrer qualquer diretório descendente conectado ao diretório specificRepo que contém um init .py!
Qiao Yi 14/03
3
isso funcionou para mim, mas você poderia explicar onde esta variável PYTHONPATH está localizada? e como "exportar PYTHONPATH" sabe para localizar o arquivo exato?
appleLover
42
lembre-se depois de editar ~/.bashrc, em seguida, executar source ~/.bashrcver stackoverflow.com/questions/2518127/...
b_dev
2
Acho que é uma má ideia colocar sudo suno início do seu arquivo .bashrc. Este post concorda comigo. No meu sistema, pelo menos, nem é necessário.
LondonRob
Essa é a resposta.
Aerin
88

Em vez de manipular, PYTHONPATHvocê também pode criar um arquivo de configuração de caminho . Primeiro descubra em qual diretório o Python procura essas informações:

python -m site --user-site

Por alguma razão, isso não parece funcionar no Python 2.7. Lá você pode usar:

python -c 'import site; site._script()' --user-site

Em seguida, crie um .ptharquivo nesse diretório que contém o caminho que você deseja adicionar (crie o diretório se ele não existir).

Por exemplo:

# find directory
SITEDIR=$(python -m site --user-site)

# create if it doesn't exist
mkdir -p "$SITEDIR"

# create new .pth file with our path
echo "$HOME/foo/bar" > "$SITEDIR/somelib.pth"
sth
fonte
Eu tentei isso usando Python 2.6 e não parece trabalhar para mim
Lorcan O'Neill
4
Eu apenas vinculei este diretório ao meu próprio diretório de biblioteca e armazene todos os meus scripts lá. Funcionou bem.
firesofmay
Resolvido para tentar novamente depois de encontrar este tópico novamente e conseguiu fazê-lo funcionar como acima desta vez! Upvoted e desculpas contritos :)
Lorcan O'Neill
Isso funciona perfeitamente, eu estava no caminho certo, mas o python -m site --user-sitee(create the directory if it doesn't exist) peças eram o que estava faltando para fazê-lo funcionar.
Aurélien Ooms
1
Preciso dar uma etapa adicional para que o python reconheça o caminho adicionado somelib.pth? Caso contrário, alguma sugestão de por que isso pode não estar funcionando?
Miladiouss
38

Isso funciona no Windows

  1. No Windows, com o Python 2.7, vá para a pasta de instalação do Python.
  2. Abra Lib / site-packages.
  3. Adicione um arquivo example.pth vazio a esta pasta.
  4. Adicione o caminho necessário ao arquivo, um por cada linha.

Então você poderá ver todos os módulos dentro desses caminhos a partir dos seus scripts.

auserdude
fonte
3
Na IMO, esta é a melhor solução, pois não depende da escolha do shell ou do ambiente de trabalho. Também funciona no linux, onde o caminho padrão do python é "/usr/local/lib/pythonX.Y/site-packages". Se isso não funcionar, tente colocar o arquivo .pth no diretório dist-packages.
matus 28/07
1
Windows 7, Python 3.6.5. Essa é a resposta. Como auserdude escreveu: Criar o "example.pth" em lib / site-packages do Python pasta e, em seguida, adicionar o seu caminho assim: C: \ somefolder \ anotherfolder \ TargetFolder
JayJay123
excelente resposta, também trabalha com python 3.7 no Windows 10, o meu Windows 10 caminho é: "C: \ Users \ {usrname} \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib"
Ali80
Pode confirmar que ele funciona para o Python 3.6.7 no Windows 10. No entanto, observe que o caminho é anexado ao seu PYTHONPATH com meios que seu módulo anexado não será encontrado no caso de uma colisão de nome.
BramAppel 11/09/19
25

Caso alguém ainda esteja confuso - se você estiver em um Mac, faça o seguinte:

  1. Abra o Terminal
  2. Tipo open .bash_profile
  3. No arquivo de texto exibido, adicione esta linha no final: export PYTHONPATH=$PYTHONPATH:foo/bar
  4. Salve o arquivo, reinicie o Terminal e pronto
entrepaul
fonte
2
Qualquer pessoa querendo saber como ver trajeto de python, use: que python
Arindam Roychowdhury
certeza que você precisa recarregar o terminal também
Utilizador
na verdade, a exportchave era a coisa que estava faltando !!!!, votado, muito obrigado!
a_m_dev 27/03
21

Você pode adicionar o caminho através do seu arquivo pythonrc, cujo padrão é ~ / .pythonrc no linux. ie

import sys
sys.path.append('/path/to/dir')

Você também pode definir a PYTHONPATHvariável de ambiente, em um arquivo rc global, como ~/.profileno mac ou linux, ou através do Painel de Controle -> Sistema -> guia Avançado -> Variáveis ​​de Ambiente no Windows.

Pimentas azuis
fonte
40
sys.path.append ('/ path / to / dir') não adiciona permanentemente a entrada.
jeremyjjbrown
15

Para dar um pouco mais de explicação, o Python construirá automaticamente seus caminhos de pesquisa (como mencionado acima e aqui ) usando o site.pyscript (normalmente localizado em sys.prefix + lib/python<version>/site-packagese também lib/site-python). Pode-se obter o valor de sys.prefix:

python -c 'import sys; print(sys.prefix)'

O script site.py adiciona vários diretórios, dependendo da plataforma, como /usr/{lib,share}/python<version>/dist-packages, /usr/local/lib/python<version>/dist-packagesao caminho de pesquisa e também pesquisa esses caminhos por <package>.ptharquivos de configuração que contêm caminhos de pesquisa adicionais específicos. Por exemplo, easy-install mantém sua coleção de pacotes instalados, que são adicionados a um arquivo específico do sistema, por exemplo, no Ubuntu /usr/local/lib/python2.7/dist-packages/easy-install.pth. Em um sistema típico, existem vários desses arquivos .pth em torno dos quais podem explicar alguns caminhos inesperados no sys.path:

python -c 'import sys; print(sys.path)'

Assim, é possível criar um arquivo .pth e colocar em qualquer um desses diretórios (incluindo o sitedir, como mencionado acima ). Esta parece ser a maneira como a maioria dos pacotes é adicionada ao sys.path em vez de usar o PYTHONPATH.

Nota: No OSX, há um caminho de pesquisa adicional especial adicionado por site.py para 'framework builds' (mas parece funcionar para o uso normal de python na linha de comando): /Library/Python/<version>/site-packages(por exemplo, para Python2.7:), /Library/Python/2.7/site-packages/onde é suposto os pacotes de terceiros para ser instalado (consulte o arquivo LEIA-ME nesse diretório). Assim, pode-se adicionar um arquivo de configuração de caminho contendo caminhos de pesquisa adicionais, por exemplo, criar um arquivo chamado /Library/Python/2.7/site-packages/pip-usr-local.pthcontendo /usr/local/lib/python2.7/site-packages/e, em seguida, o python do sistema adicionará esse caminho de pesquisa.

Pierz
fonte
10

Para mim, funcionou quando mudei o .bash_profilearquivo. Apenas mudando.bashrc arquivo funcionou apenas até eu reiniciar o shell.

Para python 2.7, ele deve se parecer com:

export PYTHONPATH="$PYTHONPATH:/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python"

no final do .bash_profilearquivo.

Peter Piper
fonte
1
Se bem entendi, isso exportará a variável para sessões Python iniciadas via terminal, certo?
jxramos
1
@jxramos - yes!
Peter Piper
9

No linux, você pode criar um link simbólico do seu pacote para um diretório do PYTHONPATH sem precisar lidar com as variáveis ​​de ambiente. Algo como:

ln -s /your/path /usr/lib/pymodules/python2.7/
Zah
fonte
7

Adicionar export PYTHONPATH="${PYTHONPATH}:/my/other/path"ao ~ / .bashrc pode não funcionar se PYTHONPATHnão existir no momento (por causa do :).

export PYTHONPATH="/my/other/path1"
export PYTHONPATH="${PYTHONPATH}:/my/other/path2"

Adicionar o acima ao meu ~ / .bashrc fez o truque para mim no Ubuntu 16.04

boyangeor
fonte
Eu fiz echo PYTHONPATHe nada apareceu! isso significa que esse PYTHONPATH não foi iniciado, então colo essa linha export PYTHONPATH=$PYTHONPATH:<PATH_TO_TF>/TensorFlow/models/research/object_detectionno meu ~/.bashrcarquivo e source ~/.bashrc nela. Mais tarde, quando eu ecoei $ PYTHONPATH, isso me deu :<PATH_TO_TF>/TensorFlow/models/research/object_detection: Alguma sugestão sobre se eu fiz algo errado?
Anu
export PYTHONPATH=<PATH_TO_TF>/TensorFlow/models/research/object_detection, Quando você está exportando PYTHONPATH pela primeira vez você tem que fazê-lo sem a ${PYTHONPATH}:parte
boyangeor
Obrigado, mas sempre que eu reiniciar o computador, o caminho do python está sendo redefinido para o que eu defini no 1º, ou seja, :<PATH_TO_TF>/TensorFlow/models/research/object_detectione remove o segundo export PYTHONPATH=$PYTHONPATH:/TensorFlow/models/research/slim. alguma sugestão sobre isso, como corrigi-lo?
Anu
7

No MacOS, em vez de dar caminho para uma biblioteca específica. Fornecendo o caminho completo para a pasta do projeto raiz em

~/.bash_profile 

fiz o meu dia, por exemplo:

export PYTHONPATH="${PYTHONPATH}:/Users/<myuser>/project_root_folder_path"

depois disso faça:

source ~/.bash_profile
testingingh
fonte
6

Só para acrescentar sobre a resposta de awesomo, você também pode adicionar essa linha em seu ~/.bash_profileou~/.profile

janex
fonte
Adicionar para .bash_profilese você usar shell de login, caso contrário usar.profile
smac89
3

A inclusão de um novo caminho para PYTHONPATH está fazendo manualmente:

adicionando o caminho ao seu perfil ~ / .bashrc, no terminal:

vim ~/.bashrc

cole o seguinte no seu perfil

export PYTHONPATH="${PYTHONPATH}:/User/johndoe/pythonModule"

então, certifique-se de fornecer seu perfil bashrc sempre que executar seu código no terminal:

source ~/.bashrc 

Espero que isto ajude.

wpmoradi
fonte
2

Eu adicionei permanentemente no Windows Vista, Python 3.5

Sistema> Painel de controle> Configurações avançadas do sistema> Avançadas (toque em) Variáveis ​​de ambiente> Variáveis ​​do sistema> (se você não vir PYTHONPATH na coluna Variável) (clique em) Novo> Nome da variável: PYTHONPATH> Valor da variável:

Por favor, escreva o diretório no valor Variável. São detalhes da resposta do Blue Peppers.

Cloud Cho
fonte
1

O script abaixo funciona em todas as plataformas, pois é puro Python. Ele usa o pathlib Path, documentado aqui https://docs.python.org/3/library/pathlib.html , para fazê-lo funcionar em várias plataformas. Você executa uma vez, reinicia o kernel e é isso. Inspirado em https://medium.com/@arnaud.bertrand/modifying-python-s-search-path-with-pth-files-2a41a4143574 .

from pathlib import Path
to_add=Path(path_of_directory_to_add)
from sys import path

if str(to_add) not in path:
    minLen=999999
    for index,directory in enumerate(path):
        if 'site-packages' in directory and len(directory)<=minLen:
            minLen=len(directory)
            stpi=index

    pathSitePckgs=Path(path[stpi])
    with open(str(pathSitePckgs/'current_machine_paths.pth'),'w') as pth_file:
        pth_file.write(str(to_add))
andrei deusteanu
fonte
1

Esta é uma atualização para este tópico que possui algumas respostas antigas.

Para aqueles que usam o MAC-OS Catalina ou algum mais recente (> = 10.15), foi introduzido um novo terminal chamado zsh(um substituto para o antigobash ).

Eu tive alguns problemas com as respostas acima devido a essa alteração e, de certa forma, fiz uma solução alternativa ao criar o arquivo ~/.zshrce colar o diretório do arquivo no diretório$PATH e$PYTHONPATH

Então, primeiro eu fiz:

nano ~/.zshrc

Quando o editor foi aberto, colei o seguinte conteúdo:

export PATH="${PATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"
export PYTHONPATH="${PYTHONPATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"

salvou e reiniciou o terminal.

IMPORTANTE: O caminho acima é definido como o caminho do meu computador, você precisa adaptá-lo ao seu python.

Caio Oliveira
fonte
0

No Python 3.6.4, você pode persistir o sys.path em sessões de python como esta:

import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print(f"current working dir: {dir_path}")

root_dir = dir_path.replace("/util", '', 1)
print(f"root dir: {root_dir}")

sys.path.insert(0, root_dir)

print(str(sys.path))

Eu sugiro fortemente que você use virtualenv e virtualenvwrapper, caso contrário você irá desorganizar seu caminho

Pato de borracha
fonte
-3

O caminho mais curto entre A <-> B é uma linha reta;

import sys
if not 'NEW_PATH' in sys.path:
  sys.path += ['NEW_PATH']
Al Kari
fonte