显示python文件中使用的文件导入/用法

时间:2014-05-23 02:16:09

标签: python maya

我想知道是否有任何类型的python编码等会在python文件中显示文件导入/使用位置?

EG。 TestA.py包含来自3个不同目录的3个文件

  • Import01:/ u / ext / TestA / UI
  • Import02:/ u / ext / TestA / src
  • Import03:/ user_data / setup / localImports

因此,在执行编码时,它将显示python文件中使用的目录列表?

我正在问我正在研究Maya中涉及的几个(也许是很多吨)脚本,有时候我找到路径但是它们是错误的(同名)并且实际上位于另一条路径

2 个答案:

答案 0 :(得分:1)

将此代码添加到module

import inspect
frame = inspect.currentframe()
if frame and frame.f_back:
    print('module "{}" is imported by "{}"'.format(__file__, frame.f_back.f_locals['__file__']))

如果module_a.py包含上述代码,main.py会导入该代码。输出是

module "/path/to/module_a.py" is imported by "/path/to/main.py"

As documented,这个答案可能不是一个确切的解决方案。因为如果不支持,则返回None。

  

CPython实现细节:此函数依赖于解释器中的Python堆栈框架支持,但不保证在Python的所有实现中都存在这种支持。如果在没有Python堆栈帧支持的实现中运行,则此函数返回None。

答案 1 :(得分:1)

在代码运行的任何时候,您都可以通过检查模块的文件属性来确定模块的来源:

import sys
for name, each_mod  in sys.modules.items():
    try:
        print name, each_mod.__file__
    except AttributeError:  # = built in module or dll
        print "?"

要在不运行代码的情况下检查导入,您需要进行更复杂的分析:这是一个可能适用于解决问题的示例方法:http://www.tarind.com/depgraph.html

您还可以创建自定义ModuleFinder,在处理导入时打印出文件来源。这样的东西,在尝试加载py / pyc文件时打印出py / pyc文件的名称。

import os
import sys
import imp
import ihooks

class ReportingFinder(object):
    """Find modules collected in a shelve archive."""

    def __init__(self, path_entry):
        self.path_entry = path_entry
        if not os.path.isdir(path_entry):
            raise ImportError

    def find_module(self, fullname, path=None):
        for suffix in (".py", ".pyc"):
            test_path = os.path.join(self.path_entry, fullname + suffix)
            print test_path
            if os.path.exists(test_path):
                print "attemnpting to load from %s" % test_path
                return self
        return None

    def load_module(self, name):
        stuff = imp.find_module(name)
        return ihooks.FancyModuleLoader(verbose=1).load_module(name, stuff)

sys.path_hooks.insert(0, ReportingFinder)

HACK WARNING !!!! 请注意,此代码是快速诊断黑客!不要用它来制作:)除了其他缺陷之外,即使代码来自pyc,它也会打印出py路径名称,而且它对包裹很愚蠢 - 我只提供它,因为它听起来像你在使用单个 - 文件脚本而不是包。它在加载时捕获导入的模块很方便。它不会打印出zip文件的名称。

听起来真正的问题是有太多的竞争路径:你应该尽可能少地尝试,以减少意外。