Python’da bir modülün hangi klasörde olduğunu nasıl öğrenebiliriz?
Bunu yapmanın birkaç farklı yöntemi var:
- çağrılan komut dosyasının yolunu bulma
- yürütülen komut dosyasının yolunu bulma
- çağrılan komut dosyasının dizinini bulma
__file__
kullanımı
İçe aktardığınız bir modül için:
import bir_modul
bir_modul.__file__
modülün mutlak yolunu döndürür. Ancak, komut dosyası göz önüne alındığında aşağıdaki gibi bir dosyadan çağırılan kod bloğu (foo.py):
#foo.py
print '__file__', __file__
(‘python foo.py’ ile çağırdık) sadece ‘foo.py’ döndürecektir. Dosyanın başına shebang eklerseniz:
#!/usr/bin/python
#foo.py
print '__file__', __file__
ve ./foo.py olarak çağırırsanız, çıktı olarak ‘./foo.py’ döndürülür. Farklı bir dizinden çağırdığımızda:
python bar/foo.py
veya bir shebang ekleyerek ve dosyayı doğrudan çalıştırdığımızda:
bar/foo.py
‘bar/foo.py’ şeklinde (göreli yol) döndürülür.
Dizini bulma
Buradan sonra os.path.dirname(__file__)
ile dizini bulmak zor olabilir. Bu kodu dosyayla aynı dizinden çağırırsanız boş bir dize döndürür (en azından benim sistemimde böyle).
# foo.py
import os
print '__file__ çıktısı:', __file__
print 'os.path.dirname(__file__) çıktısı:', os.path.dirname(__file__)
çıkış yapacak:
__file__ çıktısı: foo.py
os.path.dirname(__file__) çıktısı:
Başka bir deyişle, boş bir dize döndürür, bu nedenle geçerli dosya için kullanmak istiyorsanız (alınan bir modül dosyasının aksine) bu yöntem pek güvenilir görünmüyor. Bunu aşmak için abspath
kullanabiliriz:
# foo.py
import os
print 'os.path.abspath(__file__) çıktısı:', os.path.abspath(__file__)
print 'os.path.dirname(os.path.abspath(__file__)) çıktısı:', os.path.dirname(os.path.abspath(__file__))
Çıktı:
os.path.abspath(__file__) çıktısı: /home/user/bar/foo.py
os.path.dirname(os.path.abspath(__file__)) çıktısı: /home/user/bar
abspath()’ın sembolik linkleri çözümlemediğini unutmayın. Bunu yapmak istiyorsanız, bunun yerine realpath() kullanın.
inspect modülünü kullanma
Alternatif olarak inspect modülünü kullanabiliriz.
inspect
, import edilen modüller için iyi çalışıyor gibi görünüyor ve oldukça kısa:
import os
import inspect
print 'inspect.getfile(os) çıktısı:', inspect.getfile(os)
itaatkar bir şekilde mutlak yolu döndürüyor. Yürütülen komut dosyasının yolunu bulmak için ise:
inspect.getfile(inspect.currentframe())
Kullanabiliriz. Şu anda yürütülen komut dosyasının mutlak yolunu ise
inspect.getabsfile(inspect.currentframe())