模块从哪里导入?

时间:2011-08-22 17:13:50

标签: python

假设我有两个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 个答案:

答案 0 :(得分:63)

试试这个:

>>> 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__))

答案 1 :(得分:16)

可能有一种更简单的方法可以做到这一点,但这有效:

import inspect

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

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

答案 2 :(得分:11)

尝试my_module.__file__找出它的来源。如果你得到AttributeError,它可能不是Python源(.py)文件。

答案 3 :(得分:2)

此外,如果您有一个来自模块f的函数/类m,您可以使用模块inspect

获取模块的路径
import inspect
from m import f

print inspect.getmodule(f)

答案 4 :(得分:2)

我写了一个简单的脚本,所以我有命令pywhich 这让我可以找到Python模块的来源。 它不适用于某些没有\__file__属性的内置组件。

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

% pywhich os

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

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

这是我的方法:

Floating Action Button

答案 8 :(得分:0)

您不需要任何额外的包。对于python3

python3 -m pip show <focal_package>

答案 9 :(得分:-4)

其他答案没问题,但如果您想从里面告诉导入的模块,那么

print "I was imported from %s" % __file__