__file__ değişkeni ne anlama geliyor / ne yapıyor?


179
A = os.path.join(os.path.dirname(__file__), '..')

B = os.path.dirname(os.path.realpath(__file__))

C = os.path.abspath(os.path.dirname(__file__))

Genellikle bunları gerçek yolla bağlarım. Ancak çalışma zamanında yolu belirleyen bu ifadelerin bir nedeni vardır ve ben gerçekten os.path modülünü anlamak istiyorum, böylece kullanmaya başlayabilirsiniz.

Yanıtlar:


163

Bir modül Python'daki bir dosyadan yüklendiğinde __file__, yolu ayarlanır. Daha sonra, dosyanın bulunduğu dizini bulmak için bunu diğer işlevlerle birlikte kullanabilirsiniz.

Örneklerinizi birer birer almak:

A = os.path.join(os.path.dirname(__file__), '..')
# A is the parent directory of the directory where program resides.

B = os.path.dirname(os.path.realpath(__file__))
# B is the canonicalised (?) directory where the program resides.

C = os.path.abspath(os.path.dirname(__file__))
# C is the absolute path of the directory where the program resides.

Bunlardan döndürülen çeşitli değerleri burada görebilirsiniz:

import os
print(__file__)
print(os.path.join(os.path.dirname(__file__), '..'))
print(os.path.dirname(os.path.realpath(__file__)))
print(os.path.abspath(os.path.dirname(__file__)))

ve (gibi farklı yerlerden çalıştırmak emin olun ./text.py, ~/python/text.pyne fark markaları görmek benzeri ve).


7
İyi cevap, ancak diğer cevaplardan diğer önemli ayrıntılara bakın: __file__her durumda tanımlanmamıştır, örneğin statik olarak bağlı C modülleri. Her __file__zaman müsait olmaya güvenemeyiz .
Chris Johnson

5
Yorumlayıcıda tüm örnekler geri döner name '__file__' is not defined.
user1063287

10
@ user1063287 DemoUser'ın cevabına bakın; __file__bir dosyadan yüklenmişse, modülün yüklendiği dosyanın yol adıdır. Bu __file__, yalnızca yorumlayıcıda olmayan bir komut dosyası olarak çalıştırdığınızda çalışacağı anlamına gelir . (Yorumlayıcıya
GENÇ

59

Önce biraz kafa karışıklığına değinmek istiyorum. __file__bir joker karakter değil, bir özelliktir. Çift alt çizgi öznitelikleri ve yöntemleri, sözleşmeyle "özel" kabul edilir ve özel bir amaca hizmet eder.

http://docs.python.org/reference/datamodel.html hepsi olmasa da birçok özel yöntem ve özelliği gösterir.

Bu durumda __file__bir modülün (modül nesnesi) bir özelliğidir. Python'da bir .pydosya bir modüldür. Bu nedenle import amodule, __file__farklı koşullar altında farklı şeyler anlamına gelen bir niteliğe sahip olacaktır .

Dokümanlardan alınmıştır:

__file__bir dosyadan yüklenmişse, modülün yüklendiği dosyanın yol adıdır. __file__Nitelik statik tercüman içine bağlandıkları C modülleri için mevcut değildir; paylaşılan bir kitaplıktan dinamik olarak yüklenen uzantı modülleri için, paylaşılan kitaplık dosyasının yol adıdır.

Sizin durumunuzda modül, __file__global ad alanında kendi özelliğine erişiyor .

Bunu çalışırken görmek için şunu deneyin:

# file: test.py

print globals()
print __file__

Ve koş:

python test.py

{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__':
 'test_print__file__.py', '__doc__': None, '__package__': None}
test_print__file__.py

23

Başına belgeler :

__file__bir dosyadan yüklenmişse, modülün yüklendiği dosyanın yol adıdır. __file__Nitelik statik tercüman içine bağlandıkları C modülleri için mevcut değildir; paylaşılan bir kitaplıktan dinamik olarak yüklenen uzantı modülleri için, paylaşılan kitaplık dosyasının yol adıdır.

ve ayrıca :

__file__modül yerleşik değilse (ve böylece listelenmişse sys.builtin_module_names), bu durumda öznitelik ayarlanmadığı sürece dosyanın “yolu” olacaktır .


13

Kullanma __file__çeşitli kombine os.pathmodüllerden bütün yollar cari modülün dizin yeri göreceli olmasını sağlar. Bu, modüllerinizin / projelerinizin diğer makinelere taşınabilir olmasını sağlar.

Projenizde şunları yapabilirsiniz:

A = '/Users/myname/Projects/mydevproject/somefile.txt'

ve daha sonra sunucunuzdaki gibi bir dağıtım dizini ile konuşlandırmayı deneyin, böylece /home/web/mydevproject/kodunuz yolları doğru bulamaz.

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.