В python, если модуль вызывает функции другого модуля, возможно ли для функции получить доступ к пути к файлу первого модуля? - PullRequest
1 голос
/ 11 августа 2011

Не передавая его в качестве параметра ...

Пример.В test1.py:

def function():
    print (?????)

и в test2.py

import test1

test1.function()

Можно ли написать ?????так запуск test2.py выводит «test2.py» или полный путь к файлу? __ file __ выведет «test1.py».

Ответы [ 4 ]

3 голосов
/ 11 августа 2011

Этого можно достичь, используя sys._getframe():

% cat test1.py
#!/usr/bin/env python

import sys

def function():
    print 'Called from within:', sys._getframe().f_back.f_code.co_filename

test2.py очень похоже на ваше, но с фиксированной import:

% cat test2.py
#!/usr/bin/env python

import test1

test1.function()

Тестовый прогон ...

% ./test2.py 
Called from within: ./test2.py

N.B:

Детали реализации CPython: эту функцию следует использовать только для внутренних и специализированных целей. Не гарантируется существование во всех реализациях Python.

1 голос
/ 11 августа 2011

Вы можете сначала получить кадр звонящего.

def fish():
    print sys._getframe(-1).f_code.co_filename
0 голосов
/ 11 августа 2011

Это то, что вы ищете?

test1.py:

import inspect
def function():
  print "Test1 Function"
  f = inspect.currentframe()
  try:
    if f is not None and f.f_back is not None:
      info = inspect.getframeinfo(f.f_back)
      print "Called by: %s" % (info[0],)
  finally:
    del f

test2.py:

import test1
test1.function()
$ python test2.py
Test1 Function
Called by: test2.py
0 голосов
/ 11 августа 2011

Если я правильно понимаю, вам нужно:

import sys
print sys.argv[0]

Это дает:

$ python abc.py 
abc.py
...