Python kullanarak python yolumu nasıl bulabilirim?


352

Sistemimin PYTHONPATHdeğişkeninde hangi dizinlerin bir Python betiğinden (veya etkileşimli kabuğundan) listelendiğini nasıl öğrenebilirim ?


25
Ne yapmaya çalıştığınızdan emin değilim, ancak içe aktarılan modülleri aramak için hangi klasörlerin kullanıldığını bilmek istiyorsanız, güvenmemelisiniz PYTHONPATH. Bunun için kullanın sys.path.
Vanuan

Basit bir deneyle, Vanuan'ın cevabını aşağıda buldum (yazdırma sys.path) sadece PYTHONPATH yazdırıyor. Bu, PYTHONPATH öğesine eklenen add_path (new_path) değerini değiştirdikten sonra çalışır.
Chan Kim

6
Bu yazının başlığı ve gövde iki farklı soru soruyor. sys.path"Modüller için arama yolunu belirten dizelerin listesi" - docs.python.org/2/library/sys.html#sys.path . PYTHONPATH bu listeyi etkileyen bir ortam değişkenidir. Herhangi bir makul tanımı sys.pathile "python yolu" dir.
spinkus

4
Unutma python -m site.
Andrew McKinlay

Yanıtlar:


237

sys.pathözellikle PYTHONPATHortam değişkeninizde olmayan öğeleri içerebilir . Değişkeni doğrudan sorgulamak için şunu kullanın:

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

3
(veya daha genel olarak ... bölünmüş (os.sep)). Neden aşkı almadığınızı anlayamıyorum, Mark. Cevabınız teknik olarak Paul D Waite'ın sorusuna kendi cevabından daha doğru mu ????
mjv


2
Ve ayırıcıdaki bu problem muhtemelen neden aşka kavuşmuyordum. Beni düzleştirdiğin için teşekkürler.
Mark Ransom

11
Ve bir KeyError alırsanız, sistemimde PYTHONPATH tanımlanmadığı anlamına mı geliyor? Bu bir problem mi? Teşekkürler
glarrain 13:11

9
@glarrin, correct - KeyError, PYTHONPATH'ın tanımlanmadığı anlamına gelir. Bu zaten sorun değil çünkü önceden ayarlanmış varsayılan yollar var, bakın sys.path.
Mark Ransom

602

Muhtemelen bunu da istersiniz:

import sys
print(sys.path)

Veya terminalden bir astar olarak:

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

Uyarı : Eğer Python birden çok sürümü yüklü varsa karşılık gelen komutu kullanmalısınız python2veya python3.


Aynı. Linux aaa.com 2.6.18-4-686-bigmem # 1 SMP Çar 6 Haz 09:41:07 UTC 2007 i686 GNU / Linux ... Debian Sarge
Spechal

7
Bu, geçerli çalışma zamanının python yolunu almanın platform ve ortamdan bağımsız yoludur.
Dmitry Minkovsky

14
Bu cevap benim durumum için kabul edilen cevaptan çok daha yararlı oldu. Çevre değişkenlerimin ne olduğunu biliyorum. Python'un ortam değişkenimin yanı sıra nereye işaret etmeye karar verdiğini bilmem gerekiyordu.
Vorticity

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

@mirceamironenco değişti
Vanuan

11

Diğer yanıtı düzenleyemiyorum. Yalnızca Windows olması nedeniyle küçük bir hata var. Daha genel bir çözüm os.sep'i aşağıdaki gibi kullanmaktır:

sys.path, özellikle PYTHONPATH ortam değişkeninizde bulunmayan öğeleri içerebilir. Değişkeni doğrudan sorgulamak için şunu kullanın:

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

6
Gelecekteki okuyucular için: os.sepişletim sisteminin dizin ayırıcısını döndürür, örn /. Python yolunda kullanılan ayırıcı farklıdır ve os.pathsepkabul edilen cevapta gösterildiği gibi döndürülür .
Paul D.Waite

3

PYTHONPATH değeri bir dizin listesi olan bir ortam değişkenidir. Ayarlandıktan sonra, diğer standartlarla birlikte içe aktarılan modülleri aramak için Python tarafından kullanılır. ve Python'un "sys.path" dosyasında listelenen 3. taraf kütüphane dizinleri.

Diğer ortam değişkenleri gibi, onu kabukta veya ~ / .bashrc'de dışa aktarabilirsiniz, buraya bakın . Os.environ ['PYTHONPATH'] 'yi Python'daki değeri için aşağıda gösterildiği gibi sorgulayabilirsiniz:

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

Kabukta EĞER

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

SONRA sonuç =>

/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']

ELSE sonucu =>

PYTHONPATH is not defined

PYTHONPATH değerini birden çok yola ayarlamak için buraya bakın .

Çalışma zamanında sys.path.insert (), del veya remove () ile bir arama yolu ekleyebilir veya silebilir, ancak os.environ [] aracılığıyla DEĞİLDİR. Misal:

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

Özetle, PYTHONPATH, sys.path dosyasına içe aktarılan modüller için Python arama yollarını belirtmenin bir yoludur. Liste işlemlerini PYTHONPATH yardımı olmadan doğrudan sys.path'e de uygulayabilirsiniz.


0

Python bana bir hata mesajı verdiğinde nerede yaşadığını söyler :)

>>> 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'
>>>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.