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

显示python文件中使用的文件导入/使用,python,maya,Python,Maya,我想知道是否有任何类型的python编码等会在python文件中显示文件导入/使用的位置 例如,TestA.py包含来自3个不同目录的3个文件 导入01:/u/ext/TestA/UI Import02:/u/ext/TestA/src 导入03:/user\u数据/设置/本地导入 因此,在执行编码时,它将显示python文件中使用的目录列表 我问的是,当我正在处理几个(将来可能是很多吨)Maya中大量涉及的脚本时,有时我找到了路径,但它们是错误的(同名),并且实际位于另一个路径中将此代码添

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

例如,TestA.py包含来自3个不同目录的3个文件

  • 导入01:/u/ext/TestA/UI
  • Import02:/u/ext/TestA/src
  • 导入03:/user\u数据/设置/本地导入
因此,在执行编码时,它将显示python文件中使用的目录列表


我问的是,当我正在处理几个(将来可能是很多吨)Maya中大量涉及的脚本时,有时我找到了路径,但它们是错误的(同名),并且实际位于另一个路径中

将此代码添加到
模块

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"
,这个答案可能不是一个精确的答案。因为如果不支持,则返回None

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


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

import sys
for name, each_mod  in sys.modules.items():
    try:
        print name, each_mod.__file__
    except AttributeError:  # = built in module or dll
        print "?"
要在不运行代码的情况下检查导入,您需要进行更复杂的分析:下面是一个示例方法,该方法可能适用于解决此问题:

您还可以创建一个自定义文件,在处理导入时打印出文件源。类似这样的东西,当尝试加载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)
黑客警告请注意此代码是一个快速诊断黑客!不要将其用于生产:)除其他缺陷外,即使代码来自pyc,它也会打印出py路径名,而且对于包来说它很愚蠢——我之所以提供它,是因为听起来您使用的是单文件脚本,而不是包。它很方便在加载导入的模块时捕获它们。它不会打印出zip文件的名称


听起来真正的问题在于有太多相互竞争的途径:你应该尽量少走,这样惊喜就少了。

是的,有。该模块系统非常容易破解,我想你可以很容易地编写一个自定义加载程序来跟踪使用的目录-但我没有时间发布正确的答案。谢谢你回复我。我试过了,但似乎不起作用。因为我正在处理的这个python文件包含从服务器导入的模块(自定义脚本),即使我保存了一个文件,它似乎也无法工作。此外,是否可以在不运行代码的情况下进行检查?如果我在文件的目录中输入(我想知道它包含的路径的模块),它会显示出来?这似乎就是我要找的。从来没有想过它会如此复杂,因为我认为只要编写一个外部代码来显示模块就可以了。我将尝试一下,看看它是否适合我的使用。谢谢