假设我有一个名为pymodule
的python模块,位于名为pymodule.py
的文件中。
此外,假设pymodule
由许多其他python程序导入,例如program0.py
,program1.py
和program2.py
。
我是否可以在pymodule.py
内编写任何代码以在运行时确定导入的文件的名称?在此示例中,我们最终会使用/path/to/program0.py
,/path/to/program1.py
或/path/to/program2.py
,具体取决于这三个程序中的哪一个正在运行。
当然,可能存在导入pymodule
的嵌套导入组,因此在一般情况下,我理想地希望获得整组导入祖先文件名。运行时。
有没有办法在python3中执行此操作?
非常感谢。
答案 0 :(得分:0)
行。我想到了。此代码可以驻留在pymodule.py
...
# This is the "parent" of the current module.
# `sys._getframe(0)` would be `pymodule.py`.
f = sys._getframe(1)
while f is not None:
print('filename: {}'.format(f.f_code.co_filename)
f = f.f_back
如果/path/to/program0.py
正在运行,则打印出以下内容......
filename: <frozen importlib._bootstrap>
filename: <frozen importlib._bootstrap_external>
filename: <frozen importlib._bootstrap>
filename: <frozen importlib._bootstrap>
filename: <frozen importlib._bootstrap>
filename: /path/to/program0.py
所以,我所要做的就是忽略以<frozen ...
开头的项目,我将获得祖先的文件名。这是一个功能......
def ancestor_importers():
ancestors = []
# Start with item number 2 here, because we're
# inside of a function. Assume this function
# resides at the top level of `pymodule`. If not,
# the argument of sys._getframe(2) needs to be
# adjusted accordingly.
f = sys._getframe(2)
while f is not None:
fn = f.f_code.co_filename
if not fn.startswith('<frozen '):
ancestors.append(fn)
f = f.f_back
return ancestors