2013-04-30 9 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どこで実行されたのかを知りたいのですが、それを関数本体の変数として使用します。 – 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]でも

3

に渡される引数を指定しないで、常にファイルランニングの名前/パスであるあなたが使用することができtraceback.extract_stack

これに基づき
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 

...あなたが実行しているスクリプトの修飾パスはもっと欲しいと思えます。 realpath()を使用して

、試す場合は...

import sys 
import os 

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

あなたはシンボリックリンクからスクリプトを実行している場合にも対応する必要があります。

関連する問題