显示python文件中使用的文件导入/使用
我想知道是否有任何类型的python编码等会在python文件中显示文件导入/使用的位置 例如,TestA.py包含来自3个不同目录的3个文件显示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中大量涉及的脚本时,有时我找到了路径,但它们是错误的(同名),并且实际位于另一个路径中将此代码添
- 导入01:/u/ext/TestA/UI
- Import02:/u/ext/TestA/src
- 导入03:/user\u数据/设置/本地导入
我问的是,当我正在处理几个(将来可能是很多吨)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文件包含从服务器导入的模块(自定义脚本),即使我保存了一个文件,它似乎也无法工作。此外,是否可以在不运行代码的情况下进行检查?如果我在文件的目录中输入(我想知道它包含的路径的模块),它会显示出来?这似乎就是我要找的。从来没有想过它会如此复杂,因为我认为只要编写一个外部代码来显示模块就可以了。我将尝试一下,看看它是否适合我的使用。谢谢