我想知道是否有任何类型的python编码等会在python文件中显示文件导入/使用位置?
EG。 TestA.py包含来自3个不同目录的3个文件
因此,在执行编码时,它将显示python文件中使用的目录列表?
我正在问我正在研究Maya中涉及的几个(也许是很多吨)脚本,有时候我找到路径但是它们是错误的(同名)并且实际上位于另一条路径
答案 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文件的名称。
听起来真正的问题是有太多的竞争路径:你应该尽可能少地尝试,以减少意外。