2013-04-30 16 views
5

where bir işlevi nasıl tanımlamalıyım, hangi argüman iletilmediyse, nerede yürütüldüğünü anlatabilir miyim? tüm dosyalar ~/app/Bir fonksiyonun nerede yürütüldüğünü belirleyin.

a.py:

def where(): 
    return 'the file name where the function was executed' 

b.py:

from a import where 
if __name__ == '__main__': 
    print where() # I want where() to return '~/app/b.py' like __file__ in b.py 

c.py: En fazla bakmak gerekir

from a import where 
if __name__ == '__main__': 
    print where() # I want where() to return '~/app/c.py' like __file__ in c.py 
+4

Dikkat etmeden önce, istediğiniz bilgiyi '__file__' olarak kullanabilirsiniz. Neden geri dönmek için bir işlev yazmanız gerekiyor? – kindall

+0

Burada bir göz atın: http://docs.python.org/2/library/inspect.html – StoryTeller

+0

@kindall Nerede() nerede yürütüldüğünü bilmek istiyorum ve işlev gövdesinde değişken olarak kullanın. – walknotes

cevap

11

çağrı yığını inspect.stack():

from inspect import stack 

def where(): 
    caller_frame = stack()[1] 
    return caller_frame[0].f_globals.get('__file__', None) 

hatta:

def where(): 
    caller_frame = stack()[1] 
    return caller_frame[1] 
1
import sys 

if __name__ == '__main__': 
    print sys.argv[0] 

sys.argv [0] bile

3

geçirilen bağımsız değişken olmadan, her zaman dosya koşu adı/yolu kullanabilirsiniz traceback.extract_stack:

buna dayanarak
import traceback 
def where(): 
    return traceback.extract_stack()[-2][0] 
0

...

print where() # I want where() to return '~/app/b.py' like __file__ in b.py 

... istediğin gibi çalıştığın komut dosyasının nitelikli yolu.

Bu durumda, denemek

...

import sys 
import os 

if __name__ == '__main__': 
    print os.path.realpath(os.path.join(os.getcwd(), os.path.expanduser(__file__))) 

bir sembolik bağlantıdan komut çalıştırdığınız durumda baş etmelidir realpath() kullanma.

İlgili konular