koddla

Yazılımcıları bilgi ile güçlendirir.

Python’da modülün yolu nasıl alınır?

Python’da bir modülün hangi klasörde olduğunu nasıl öğrenebiliriz?

Bunu yapmanın birkaç farklı yöntemi var:

  1. çağrılan komut dosyasının yolunu bulma
  2. yürütülen komut dosyasının yolunu bulma
  3. ç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()) 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top