Как найти файл кода объекта? - PullRequest
4 голосов
/ 19 августа 2011

Мне нужно знать, откуда берется кодовый объект; его модуль. Поэтому я (наивно) попытался:

os.path.abspath(code.co_filename)  

Но это может или не может работать, (я думаю, это потому, что abspath зависит от cwd)

Есть ли способ получить полный путь модуля объекта кода?

РЕДАКТИРОВАТЬ:
Функции из модуля inspect: getfile, getsourcefile, getmodule, получают только имя файла, а не его путь (то же самое, что co_filename). Может быть, они используют abspath.

Ответы [ 3 ]

3 голосов
/ 19 августа 2011
import inspect
print inspect.getfile(inspect)
1 голос
/ 19 августа 2011

Функция inspect.getsourcefile() - это то, что вам нужно, она возвращает относительный путь к файлу, где можно найти источник объекта.

0 голосов
/ 19 августа 2011

Если у вас есть доступ к модулю, попробуйте module.__file__.

>>> import xml
>>> xml.__file__
'/usr/local/lib/python2.6/dist-packages/PyXML-0.8.4-py2.6-linux-i686.egg/_xmlplus/__init__.pyc'

Если у вас нет, то что-то вроде этого должно работать:

>>> import xml.etree.ElementTree as ET
>>> thing = ET.Element('test')
>>> __import__(thing.__module__).__file__
'/usr/local/lib/python2.6/dist-packages/PyXML-0.8.4-py2.6-linux-i686.egg/_xmlplus/__init__.pyc'

В этом случае,мы используем тот факт, что импорт может быть вызван для строковой версии модуля, которая возвращает фактический объект модуля, а затем вызывает __file__ для этого.

...