如何了解给定Python模块的源文件的安装位置? Windows和Linux上的方法是否不同?
我正在尝试特别寻找datetime
模块的来源,但我也对更通用的答案感兴趣。
#1楼
我知道这个答案要晚4年了,但是现有的答案会误导人们。
正确的方法永远不要__file__
,或尝试遍历sys.path
并进行搜索等(除非您需要向后兼容2.1以上)。
它是inspect
模块-特别是getfile
或getsourcefile
。
除非您要学习和实现用于将.pyc
映射到.py
文件的规则(对于CPython 2.x,已记录但很痛苦,而对于其他实现或3.x则没有任何记录); 处理.zip归档文件,鸡蛋和模块包; 尝试以不同的方式获得不支持__file__
.so
/ .pyd
文件的路径; 弄清楚Jython / IronPython / PyPy的作用; 等等。在这种情况下,请继续努力。
同时,可以从http://hg.python.org/cpython/file/XY/
(例如2.7或3.3 )在线获取2.0+以后的每个Python版本的源代码。 因此,一旦发现inspect.getfile(datetime)
是一个.so
或.pyd
文件(例如/usr/local/lib/python2.7/lib-dynload/datetime.so
,就可以在Modules目录中查找它。 严格来说,无法确定哪个文件定义了哪个模块,但是几乎所有文件都是foo.c
或foomodule.c
,因此不难猜测datetimemodule.c是您想要的。
#2楼
这是获取模块文件名的一种方法,适用于shell别名:
echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)' | python -
设置为别名:
alias getpmpath="echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)' | python - "
使用方法:
$ getpmpath twisted
/usr/lib64/python2.6/site-packages/twisted/__init__.pyc
$ getpmpath twisted.web
/usr/lib64/python2.6/site-packages/twisted/web/__init__.pyc
#3楼
从标准库尝试imp.find_module
>>> import imp
>>> imp.find_module('fontTools')
(None, 'C:\\Python27\\lib\\site-packages\\FontTools\\fontTools', ('', '', 5))
>>> imp.find_module('datetime')
(None, 'datetime', ('', '', 6))
#4楼
在Windows上,您可以找到python模块的位置,如下所示:ie find rest_framework模块
#5楼
sys.path
列表包含将在运行时搜索模块的目录列表:
python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3161312