Güncelleme 2018-11-28:
İşte Python 2 ve 3 ile yapılan deneylerin bir özeti.
main.py - foo.py çalıştırır foo.py - lib / bar.py çalıştırır
lib / bar.py - dosyayolu ifadelerini yazdırır
| Python | Run statement | Filepath expression |
|--------+---------------------+----------------------------------------|
| 2 | execfile | os.path.abspath(inspect.stack()[0][1]) |
| 2 | from lib import bar | __file__ |
| 3 | exec | (wasn't able to obtain it) |
| 3 | import lib.bar | __file__ |
Python 2 için, paketlere geçmek daha açık olabilir, bu yüzden kullanabilirsiniz from lib import bar
- sadece __init__.py
iki klasöre boş dosyalar ekleyin .
Python 3 için, execfile
mevcut değil - en yakın alternatif exec(open(<filename>).read())
, ancak yığın çerçevelerini etkiler. Sadece kullanımı en basit import foo
ve import lib.bar
- __init__.py
dosya gerekmez.
Ayrıca bkz. İçe aktarma ve execfile arasındaki fark
Orijinal cevap:
İşte Windows'taki Python 2.7.10 ile bu konudaki cevaplara dayanan bir deney.
Yığın tabanlı olanlar, güvenilir sonuçlar veren tek kişilerdir. Son ikisi en kısa sözdizimine sahiptir , yani -
print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib
İşte bunlara fonksiyon olarak sys'e ekleniyor ! @Usagi ve @pablog'a teşekkür ederiz
Aşağıdaki üç dosyaya dayanarak ve python main.py
main.py ile klasöründen çalıştırılır (ayrıca mutlak yollarla yürütme ve ayrı bir klasörden çağırma).
C: \ execfile('foo.py')
dosyayolları \ main.py: execfile('lib/bar.py')
C: \ dosyayolları \ foo.py: C: \ dosyayolları \ lib \ bar.py:
import sys
import os
import inspect
print "Python " + sys.version
print
print __file__ # main.py
print sys.argv[0] # main.py
print inspect.stack()[0][1] # lib/bar.py
print sys.path[0] # C:\filepaths
print
print os.path.realpath(__file__) # C:\filepaths\main.py
print os.path.abspath(__file__) # C:\filepaths\main.py
print os.path.basename(__file__) # main.py
print os.path.basename(os.path.realpath(sys.argv[0])) # main.py
print
print sys.path[0] # C:\filepaths
print os.path.abspath(os.path.split(sys.argv[0])[0]) # C:\filepaths
print os.path.dirname(os.path.abspath(__file__)) # C:\filepaths
print os.path.dirname(os.path.realpath(sys.argv[0])) # C:\filepaths
print os.path.dirname(__file__) # (empty string)
print
print inspect.getfile(inspect.currentframe()) # lib/bar.py
print os.path.abspath(inspect.getfile(inspect.currentframe())) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # C:\filepaths\lib
print
print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib
print
__file__
özniteliği mutlak mı yoksa göreli mi?