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?

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.)


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.


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

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"]

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.


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/"])
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.