2013-04-30 7 views
5

Jak zdefiniować funkcję, where, która może określić, gdzie została wykonana, bez żadnych argumentów? wszystkie pliki w katalogu ~/app/Określić, gdzie została wykonana funkcja?

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:

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

Jak już zauważyłeś, masz już informacje, które chcesz, jako "__file__". Dlaczego musisz napisać funkcję, aby ją zwrócić? – kindall

+0

Zajrzyj tutaj: http://docs.python.org/2/library/inspect.html – StoryTeller

+0

@kindall Chcę, aby where() wiedział, gdzie jest wykonywane, i używać go jako zmienną w jego ciele funkcji. – walknotes

Odpowiedz

11

Trzeba spojrzeć w górę stos wywołań za pomocą inspect.stack():

from inspect import stack 

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

lub nawet:

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

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

sys.argv [0] jest zawsze nazwa/ścieżka do biegania plików, nawet bez przeszły w

0

na tej podstawie ...

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

... brzmi bardziej jak pożądana jest kwalifikowana ścieżka skryptu, który wykonujesz.

W takim przypadku, spróbuj ...

import sys 
import os 

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

Korzystanie realpath() powinien poradzić sobie z przypadkiem, gdy masz uruchomiony skrypt z dowiązania symbolicznego.

Powiązane problemy