2013-04-30 11 views
5

Wie soll ich eine Funktion definieren, where, die sagen kann, wo es ausgeführt wurde, ohne dass Argumente übergeben wurden? alle Dateien in ~/app/Ermitteln, wo eine Funktion ausgeführt wurde?

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

Wie Sie bemerken, haben Sie bereits die gewünschten Informationen als '__file__'. Warum müssen Sie eine Funktion schreiben, um es zurückzugeben? – kindall

+0

Schau mal hier: http://docs.python.org/2/library/inspect.html – StoryTeller

+0

@kindall Ich will wo() wissen, wo es ausgeführt wird, und verwenden Sie es als eine Variable in seinem Funktionskörper. – walknotes

Antwort

11

Sie müssen nachschlagen die Aufrufliste unter Verwendung von inspect.stack():

from inspect import stack 

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

oder sogar:

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

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

sys.argv [0] ist immer der Name/Pfad der laufenden Datei, auch ohne in

3

gebenen Argumente können Sie traceback.extract_stack verwenden:

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

auf dieser Basis ...

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

... es klingt mehr nach dem, was Sie wollen, ist der qualifizierte Pfad des Skripts, das Sie ausführen.

In diesem Fall versuchen ...

import sys 
import os 

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

realpath() Verwendung mit dem Fall fertig werden soll, wenn Sie das Skript von einem symbolischen Link laufen.

Verwandte Themen