2013-04-30 3 views
5

Как определить функцию, where, которая может определить, где она была выполнена, без каких-либо аргументов? все файлы в ~/приложение/Определите, где была выполнена эта функция?

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

Как вы заметили, у вас уже есть информация, которую вы хотите как '__file__'. Зачем вам нужно написать функцию, чтобы вернуть ее? – kindall

+0

Посмотрите здесь: http://docs.python.org/2/library/inspect.html – StoryTeller

+0

@kindall Я хочу, где() знать, где он выполняется, и использовать его как varible в своем теле функции. – walknotes

ответ

11

Вы должны смотреть вверх стек вызовов с использованием inspect.stack():

from inspect import stack 

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

или даже:

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

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

sys.argv [0] всегда является имя/путь файла работает, даже без каких-либо аргументов, передаваемых в

0

Исходя из этого ...

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

... это похоже на то, что вы хотите, это квалифицированный путь к скрипту, который вы выполняете.

В этом случае, попробуйте ...

import sys 
import os 

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

Использование realpath() должны справиться со случаем, когда вы запускаете скрипт из символической ссылки.

Смежные вопросы