Como descubro meu caminho python usando python?


350

Como descubro quais diretórios estão listados na PYTHONPATHvariável do meu sistema , de dentro de um script Python (ou do shell interativo)?


24
Não sei ao certo o que você está tentando fazer, mas se quiser saber em quais pastas são usadas para procurar módulos importados, não deve confiar PYTHONPATH. Use sys.pathpara isso.
Vanuan

Por um experimento simples, encontrei a resposta de Vanuan abaixo (impressão sys.path) apenas imprime PYTHONPATH. Isso funciona depois que alteramos o valor usando add_path (new_path) que adiciona ao PYTHONPATH.
Chan Chan

6
O título deste post e o corpo fazem duas perguntas diferentes. sys.pathé "Uma lista de cadeias de caracteres que especifica o caminho de pesquisa dos módulos" - docs.python.org/2/library/sys.html#sys.path . PYTHONPATH é uma variável de ambiente que afeta esta lista. Por qualquer definição razoável, sys.pathé o seu "caminho python".
Spinkus

4
Não se esqueça python -m site.
Andrew McKinlay

Respostas:


236

sys.pathpode incluir itens que não estão especificamente na sua PYTHONPATHvariável de ambiente. Para consultar a variável diretamente, use:

import os
try:
    user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
except KeyError:
    user_paths = []

3
(ou, mais genericamente ... dividir (os.sep)). Não consigo descobrir por que você não está recebendo amor, Mark. Sua resposta é tecnicamente mais precisa do que a resposta de Paul D Waite à sua pergunta ????
Mjv 28/09/09

5
o os.sep está incorreto, consulte stackoverflow.com/questions/1499019/… #
Mark Ransom

2
E esse problema com o separador é provavelmente o motivo pelo qual eu não estava tendo amor. Obrigado por me esclarecer.
Mark Ransom

11
E se receber um KeyError, isso significa que PYTHONPATH não está definido no meu sistema? Isso é um problema? Obrigado
glarrain

9
@arrarrin, correto - KeyError significa que PYTHONPATH não está definido. Não será um problema, porque já existem caminhos padrão configurados, consulte sys.path.
Mark Ransom

600

Você provavelmente também desejaria isso:

import sys
print(sys.path)

Ou como um liner do terminal:

python -c "import sys; print('\n'.join(sys.path))"

Advertência : Se você possui várias versões do Python instaladas, use um comando python2ou python3.


Mesmo. Linux aaa.com 2.6.18-4-686-bigmem # 1 SMP Wed 6 de junho 09:41:07 UTC 2007 i686 GNU / Linux ... Debian Sarge
Spechal

7
Essa é a maneira independente de plataforma e ambiente de obter o caminho python do tempo de execução atual.
Dmitry Minkovsky

13
Essa resposta foi muito mais útil para minha situação do que a resposta aceita. Eu sei quais são minhas variáveis ​​de ambiente. Eu precisava saber para onde o python decidiu apontar além da minha variável de ambiente.
Vorticity

Para Python 3:python -c "import sys; print('\n'.join(sys.path))"
mirceamironenco

@mirceamironenco mudou
Vanuan

10

Não consigo editar a outra resposta. Tem um pequeno erro, pois é apenas para Windows. A solução mais genérica é usar os.sep como abaixo:

sys.path pode incluir itens que não estão especificamente na sua variável de ambiente PYTHONPATH. Para consultar a variável diretamente, use:

import os
os.environ['PYTHONPATH'].split(os.pathsep)

6
Para futuros leitores: os.sepretorna o separador de diretório para o sistema operacional, por exemplo /. O separador usado no caminho do Python é diferente e retornado os.pathsepcomo mostrado na resposta aceita.
Paul D. Waite

3

PYTHONPATH é uma variável de ambiente cujo valor é uma lista de diretórios. Uma vez definido, é usado pelo Python para procurar módulos importados, junto com outros std. e diretórios de bibliotecas de terceiros listados no "sys.path" do Python.

Como qualquer outra variável de ambiente, você pode exportá-lo no shell ou no ~ / .bashrc, veja aqui . Você pode consultar os.environ ['PYTHONPATH'] por seu valor em Python, como mostrado abaixo:

$ python3 -c "import os, sys; print(os.environ['PYTHONPATH']); print(sys.path) if 'PYTHONPATH' in sorted(os.environ) else print('PYTHONPATH is not defined')"

SE definido no shell como

$ export PYTHONPATH=$HOME/Documents/DjangoTutorial/mysite

ENTÃO resultado =>

/home/Documents/DjangoTutorial/mysite
['', '/home/Documents/DjangoTutorial/mysite', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

Resultado ELSE =>

PYTHONPATH is not defined

Para definir PYTHONPATH para vários caminhos, veja aqui .

Observe que é possível adicionar ou excluir um caminho de pesquisa via sys.path.insert (), del ou remove () no tempo de execução, mas NÃO através do os.environ []. Exemplo:

>>> os.environ['PYTHONPATH']="$HOME/Documents/DjangoTutorial/mysite"
>>> 'PYTHONPATH' in sorted(os.environ)
True
>>> sys.path // but Not there
['', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

>>> sys.path.insert(0,os.environ['PYTHONPATH'])
>>> sys.path // It's there
['$HOME/Documents/DjangoTutorial/mysite', '', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']
>>> 

Em resumo, PYTHONPATH é uma maneira de especificar o (s) caminho (s) de pesquisa do Python para módulos importados no sys.path. Você também pode aplicar operações de lista diretamente ao sys.path sem o auxílio do PYTHONPATH.


0

Python me diz onde ele mora quando me envia uma mensagem de erro :)

>>> import os
>>> os.environ['PYTHONPATH'].split(os.pathsep)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\martin\AppData\Local\Programs\Python\Python36-32\lib\os.py", line 669, in __getitem__
    raise KeyError(key) from None
KeyError: 'PYTHONPATH'
>>>

-1

Usa isto:

import sys
print(sys.executable)

Ou uma linha do cmd:

python -c "import sys; print(sys.executable)"

11
Parece que o autor da pergunta está solicitando a lista de diretórios python e não o caminho para o executável python real.
Sergey Shubin
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.