模块是从哪里导入的?

82 投票
10 回答
50418 浏览
提问于 2025-04-17 00:07

假设我有两个Python模块,path_b在导入路径中:

# file: path_b/my_module.py
print "I was imported from ???"

#file: path_a/app.py
import my_module

我能看到这个模块是从哪里被导入的吗?我想要的输出是类似“我被从path_a/app.py导入”的信息,如果我启动app.py的话(因为我需要文件名)。

编辑: 为了更好地理解;我可以这样写:

# file: path_b/my_module.py
def foo(file):
    print "I was imported from %s" % file

#file: path_a/app.py
import my_module
my_module.foo(__file__)

所以输出会是:

$> python path_app.py
I was imported from path_a/app.py

10 个回答

16

试试 my_module.__file__ 来看看这个模块是从哪里来的。如果你看到 AttributeError 的错误,那可能说明它不是一个Python源文件(.py文件)。

115

试试这个:

>>> import my_module
>>> my_module.__file__
'/Users/myUser/.virtualenvs/foobar/lib/python2.7/site-packages/my_module/__init__.pyc'

编辑

在这种情况下,你需要在你的模块的 __init__.py 文件中写入:

print("%s: I was imported from %s" %(__name__, __file__))
17

可能有更简单的方法来做到这一点,但这个方法是有效的:

import inspect

print(inspect.getframeinfo(inspect.getouterframes(inspect.currentframe())[1][0])[0])

请注意,如果路径是脚本所在位置的上级目录,那么打印出来的路径将是相对于当前工作目录的。

撰写回答