如何了解给定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楼
>>> 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', ... ]