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