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.