Nasıl şu anda çalıştırdığı dosyanın yolunu ve adını alabilirim?

oy
370

Ben diğer komut dosyalarını çağıran komut dosyaları var ama şu anda süreç içinde çalıştığı dosyanın dosyayolu almak gerekir.

Örneğin, ben üç dosya var diyelim. Kullanılması execfile :

  • script_1.pyçağrıları script_2.py.
  • Buna karşılık, script_2.pyçağırır script_3.py.

Nasıl dosya adını ve yolunu alabilirsiniz script_3.py, içinde koddanscript_3.py gelen argümanlar olarak bu bilgileri geçmek zorunda kalmadan, script_2.py?

(Yürütülüyor os.getcwd()orijinal başlangıç komut dosyasının filepath değil geçerli dosya getirilerini.)

Oluştur 08/09/2008 saat 20:41
kaynak kullanıcı
Diğer dillerde...                            


29 cevaplar

oy
11

Size "Şu anda süreç içinde çalıştığı dosyanın filepath" ile ne demek tamamen net değil. sys.argv[0]genellikle Python yorumlayıcısı tarafından başlatıldığı komut konumunu içerir. Kontrol sys belgelerine fazla ayrıntı için.

@Tim ve @Pat Notz belirttiğimiz gibi, __FILE__ özellik erişim sağlar

Bir dosyadan yüklenmesi halinde dosya hangi modülü yüklendi

Cevap 08/09/2008 saat 20:42
kaynak kullanıcı

oy
5

Ben sadece düşünüyorum __file__ ayrıca ödeme isteyebilirsiniz benziyor incelemek modülü .

Cevap 08/09/2008 saat 20:44
kaynak kullanıcı

oy
7

__file__Nitelik ana yürütme kodu içeren dosyanın yanı sıra ithal modüllerin her ikisi için çalışır.

Bkz https://web.archive.org/web/20090918095828/http://pyref.infogami.com/__file__

Cevap 08/09/2008 saat 20:56
kaynak kullanıcı

oy
213

p1.py:

execfile("p2.py")

p2.py:

import inspect, os
print inspect.getfile(inspect.currentframe()) # script filename (usually with path)
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # script directory
Cevap 09/09/2008 saat 00:02
kaynak kullanıcı

oy
4

Kullanabilirsiniz inspect.stack()

import inspect,os
inspect.stack()[0]  => (<frame object at 0x00AC2AC0>, 'g:\\Python\\Test\\_GetCurrentProgram.py', 15, '<module>', ['print inspect.stack()[0]\n'], 0)
os.path.abspath (inspect.stack()[0][1]) => 'g:\\Python\\Test\\_GetCurrentProgram.py'
Cevap 09/09/2008 saat 01:00
kaynak kullanıcı

oy
448
__file__

diğerleri söylediler. Ayrıca kullanmak isteyebilir os.path.realpath sembolik ortadan kaldırmak için:

import os

os.path.realpath(__file__)
Cevap 23/12/2009 saat 21:33
kaynak kullanıcı

oy
5
import sys

print sys.path[0]

Bu Geçerli betiğin yolunu basacaktır

Cevap 02/01/2010 saat 19:34
kaynak kullanıcı

oy
32

senaryonuz sadece bir dosya oluşur eğer iyi olarak işaretlenmiş öneri hepsi doğrudur.

Eğer yürütülebilir adını bulmak modül olarak ithal edilebilir bir dosyadan (geçerli program için piton tercüman geçirilen kök dosyasına yani) istiyorsanız, bunu yapmak gerekir (Bunu bir dosyada olduğunu varsayalım adlı foo.py ):

import inspect

print inspect.stack()[-1][1]

Son bir şey (çünkü [-1]yığın) içine giden ilk şey (yığınları LIFO / FİLO veri yapılan olabilir).

Sonra dosya içinde bar.py eğer import fooo basalım bar.py ziyade, foo.py bunların hepsi değeri olur ki,:

  • __file__
  • inspect.getfile(inspect.currentframe())
  • inspect.stack()[0][1]
Cevap 26/02/2010 saat 23:25
kaynak kullanıcı

oy
3
import sys
print sys.argv[0]
Cevap 19/04/2010 saat 08:47
kaynak kullanıcı

oy
0

Ben __FILE__ ile yaklaşım kullanılır
os.path.abspath(__file__)
fakat kod ilk kez çalıştırıldığında küçük bir hile, o önümüzdeki çalışır * .pyc dosyasının adını vermek .py dosyasını döndürür yoktur
bu yüzden kaldı:
inspect.getfile(inspect.currentframe())
ya
sys._getframe().f_code.co_filename

Cevap 01/03/2011 saat 10:23
kaynak kullanıcı

oy
59

Bu temizleyici olduğunu düşünüyorum:

import inspect
print inspect.stack()[0][1]

ve aynı bilgileri olarak alır:

print inspect.getfile(inspect.currentframe())

Burada [0] yığında güncel çerçeve (yığının üst) ve [1] bir dosya adı, artış yığın yani geriye gitmek için

print inspect.stack()[1][1]

geçerli çerçeveyi denilen script dosya adı olurdu. Ayrıca, [-1] kullanarak yığın orijinal arama komut altına alacak.

Cevap 08/07/2011 saat 18:50
kaynak kullanıcı

oy
8

Ben windows ortamında altında çalışmak zorunda bir senaryo var. snipped Bu kod ben bitirdim budur:

import os,sys
PROJECT_PATH = os.path.abspath(os.path.split(sys.argv[0])[0])

oldukça hacky bir karar. Ama hiç bir harici kütüphaneleri gerektirir ve benim durumumda en önemli şey.

Cevap 08/08/2012 saat 10:42
kaynak kullanıcı

oy
-1

Eğer olmadan sadece dosya adı istiyorsanız ./veya .pybu deneyebilirsiniz

filename = testscript.py
file_name = __file__[2:-3]

file_name içeride endeksi değiştirerek istediğiniz her üretebilir testscript yazdırılır []

Cevap 20/01/2013 saat 21:52
kaynak kullanıcı

oy