Bu soru üzerinde de birkaç varyasyonla uğraşmaya çalışacağım:
- çağrılan komut dosyasının yolunu bulma
- yürütülmekte olan komut dosyasının yolunu bulma
- çağrılan komut dosyasının dizinini bulma
(Bu soruların bazıları SO hakkında sorulmuştur, ancak kopya olarak kapatılmış ve buraya yeniden yönlendirilmiştir.)
Kullanım Uyarıları __file__
İçe aktardığınız bir modül için:
import something
something.__file__
modülün mutlak yolunu döndürür . Ancak, foo.py aşağıdaki komut dosyası göz önüne alındığında:
#foo.py
print '__file__', __file__
'Python foo.py' ile çağırmak sadece 'foo.py' döndürecektir. Bir shebang eklerseniz:
#!/usr/bin/python
#foo.py
print '__file__', __file__
ve ./foo.py kullanarak çağırın, './foo.py' döndürecektir. Farklı bir dizinden çağırma (örneğin, dizin çubuğuna foo.py dosyasını koyma), ardından
python bar/foo.py
veya bir shebang ekleyip dosyayı doğrudan yürütme:
bar/foo.py
'bar / foo.py' ( göreceli yol) döndürecektir .
Dizini bulma
Şimdi dizini almak için oradan gitmek os.path.dirname(__file__)
de zor olabilir. En azından sistemimde, dosyayı aynı dizinden çağırırsanız boş bir dize döndürür. ex.
# foo.py
import os
print '__file__ is:', __file__
print 'os.path.dirname(__file__) is:', os.path.dirname(__file__)
çıktı olacak:
__file__ is: foo.py
os.path.dirname(__file__) is:
Geçerli için kullanmak istiyorsanız bu güvenilir görünmüyor böylece diğer bir deyişle, boş bir dize döndürür dosyaya (karşıt olarak dosyaya bir ithal modülün). Bunu aşmak için, onu abspath çağrısı ile silebilirsiniz:
# foo.py
import os
print 'os.path.abspath(__file__) is:', os.path.abspath(__file__)
print 'os.path.dirname(os.path.abspath(__file__)) is:', os.path.dirname(os.path.abspath(__file__))
hangi gibi bir çıktı üretir:
os.path.abspath(__file__) is: /home/user/bar/foo.py
os.path.dirname(os.path.abspath(__file__)) is: /home/user/bar
Abspath () öğesinin sembolik bağlantıları ÇÖZMEZ olduğunu unutmayın. Bunu yapmak istiyorsanız, bunun yerine realpath () öğesini kullanın. Örneğin, aşağıdaki içeriğe sahip file_import_testing.py'yi işaret eden bir symlink file_import_testing_link yapmak:
import os
print 'abspath(__file__)',os.path.abspath(__file__)
print 'realpath(__file__)',os.path.realpath(__file__)
yürütme, mutlak yolları aşağıdaki gibi bir şey yazdırır:
abspath(__file__) /home/user/file_test_link
realpath(__file__) /home/user/file_test.py
file_import_testing_link -> file_import_testing.py
Inspect'i kullanma
@SummerBreeze denetleme modülünü kullanarak bahseder .
Bu, içe aktarılan modüller için iyi çalışıyor ve oldukça özlü:
import os
import inspect
print 'inspect.getfile(os) is:', inspect.getfile(os)
itaatkâr olarak mutlak yolu döndürür. Ancak şu anda yürütülen komut dosyasının yolunu bulmak için, bunu kullanmanın bir yolunu görmedim.