No script Python, como faço para definir PYTHONPATH?

115

Eu sei como configurá-lo em meu / etc / profile e em minhas variáveis ​​de ambiente.

Mas e se eu quiser configurá-lo durante um script? É o sistema de importação, sys? Como eu faço isso?

TIMEX
fonte

Respostas:

192

Você não define PYTHONPATH, você adiciona entradas a sys.path. É uma lista de diretórios que devem ser pesquisados ​​em busca de pacotes Python, então você pode simplesmente anexar seus diretórios a essa lista.

sys.path.append('/path/to/whatever')

Na verdade, sys.pathé inicializado dividindo o valor de PYTHONPATHno caractere separador de caminho ( :em sistemas semelhantes ao Linux, ;no Windows).

Você também pode adicionar diretórios usando site.addsitedir, e esse método também levará em conta os .ptharquivos existentes nos diretórios que você passar. (Isso não seria o caso com os diretórios que você especifica em PYTHONPATH.)

David Z
fonte
11
Já se passaram muitos anos desde que esta resposta foi postada, mas ainda quero acrescentar que se você quiser ter certeza de que o Python verifica o novo diretório antes de todos os outros ao importar, você deve colocar o novo diretório primeiro na lista, como no sys.path.insert(0, '/path/to/whatever').
wecsam de
39

Você pode obter e definir variáveis ​​de ambiente por meio de os.environ:

import os
user_home = os.environ["HOME"]

os.environ["PYTHONPATH"] = "..."

Mas como o seu interpretador já está em execução, isso não terá efeito. Você é melhor usar

import sys
sys.path.append("...")

que é a matriz em que você PYTHONPATHserá transformado na inicialização do interpretador.

Miku
fonte
18

Se você colocar sys.path.append('dir/to/path')sem verificar se já está adicionado, você pode gerar uma longa lista em sys.path. Para isso, recomendo:

import sys
import os # if you want this directory

try:
    sys.path.index('/dir/path') # Or os.getcwd() for this directory
except ValueError:
    sys.path.append('/dir/path') # Or os.getcwd() for this directory
Francisco Manuel Garca Botella
fonte
2
Agradável. Muito pitônico.
PartialOrder
1
Como posso esvaziar o PythonPath? Eu não quero acrescentar. Quero esvaziá-lo e colocar o que só quero dentro. Existe uma maneira de fazer isso?
Schütze
Você tentou reinicializá-lo chamando sys.path .__ init __ ()? Isso deve esvaziar o caminho do Python. Espero que isto ajude.
Thayz de
@ francisco-manuel-garca-botella Responder a perguntas antigas é muito bem-vindo neste site! Nada para se desculpar.
user7610
Eu discordo que isso seja python, e eu sugeriria que não é uma boa abordagem de programação. O tratamento de exceções é muito caro quando ocorre a exceção, portanto, você não deseja usá-lo para substituir uma instrução "if" onde é bem possível que você use o else. Um simples if 'mypath' em sys.path ... else ... seria meu conselho.
markgalassi
6

PYTHONPATH termina em sys.path , que você pode modificar em tempo de execução.

import sys
sys.path += ["whatever"]
incrédulo
fonte
Existe uma razão para preferir esta resposta a uma de @DavidZ?
Dror,
Se nada mais, é menos prolixo.
tripleee
-1

você pode definir PYTHONPATH, por os.environ['PATHPYTHON']=/some/path, então você precisa chamar os.system('python')para reiniciar o shell do python para tornar o caminho recém-adicionado eficaz.

tesla1060
fonte
1
os.system()não "reinicia o shell python", ele inicia uma nova instância interativa do Python. Quando você retorna disso, você está de volta ao script de chamada.
tripleee
-2

Eu linux isso também funciona:

import sys
sys.path.extend(["/path/to/dotpy/file/"])
Lashgar
fonte