模块是从哪里进口的?

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

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


#file: path_a/app.py
import my_module

是否可以看到模块是从哪里导入的?如果我启动 app.py (因为我需要文件名) ,我需要一个类似“ I was import from path _ a/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
40355 次浏览

尝试 my_module.__file__找出它来自哪里。如果您得到的是 AttributeError,那么它可能不是 Python 源代码(。Py)档案。

Try this:

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

Edit

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

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

其他答案是可以的,但是如果您想从 在里面中告诉它导入的模块,那么就这样做

print "I was imported from %s" % __file__

此外,如果从模块 m获得函数/类 f,则可以使用模块 inspect获取模块的路径

import inspect
from m import f


print inspect.getmodule(f)

也许有一种更简单的方法,但这种方法是有效的:

import inspect


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

请注意,如果路径是脚本位置的父目录,它将相对于当前工作目录打印出来。

我已经编写了一个简单的脚本,所以我有命令 pywhich that allows me to find where a Python module comes from. It doesn't work for some builtins like sys which doesn't have a \__file__ attribute.

这可以从 Linux 命令行运行,以查找在当前环境中运行的 Python 脚本将从何处获取模块,例如:

% pywhich os


#! /usr/bin/env python
def pywhich(module_name):
module = __import__(module_name, globals(), locals(), [], 0)
return module.__file__


if __name__ == "__main__":
import sys
print(pywhich(sys.argv[1]))

如果您想查看模块的存储位置,例如 setuptools,输入 shell:

$ python -c "import setuptools; print(setuptools.__file__)"

我是这么做的:

print(module_name.__path__)

如果您想知道文件 x.py是从哪里导入的-您可以将 raise RuntimeError()添加到 x.py的第一行,并检查堆栈跟踪..。

你不需要任何额外的包裹。对于 python3:

python3 -m pip show <focal_package>