如何找到Python模块源的位置?

雨燕双飞 提交于 2020-02-26 17:06:21

如何了解给定Python模块的源文件的安装位置? Windows和Linux上的方法是否不同?

我正在尝试特别寻找datetime模块的来源,但我也对更通用的答案感兴趣。


#1楼

我知道这个答案要晚4年了,但是现有的答案会误导人们。

正确的方法永远不要__file__ ,或尝试遍历sys.path并进行搜索等(除非您需要向后兼容2.1以上)。

它是inspect模块-特别是getfilegetsourcefile

除非您要学习和实现用于将.pyc映射到.py文件的规则(对于CPython 2.x,已记录但很痛苦,而对于其他实现或3.x则没有任何记录); 处理.zip归档文件,鸡蛋和模块包; 尝试以不同的方式获得不支持__file__ .so / .pyd文件的路径; 弄清楚Jython / IronPython / PyPy的作用; 等等。在这种情况下,请继续努力。

同时,可以从http://hg.python.org/cpython/file/XY/ (例如2.73.3 )在线获取2.0+以后的每个Python版本的源代码。 因此,一旦发现inspect.getfile(datetime)是一个.so.pyd文件(例如/usr/local/lib/python2.7/lib-dynload/datetime.so ,就可以在Modules目录中查找它。 严格来说,无法确定哪个文件定义了哪个模块,但是几乎所有文件都是foo.cfoomodule.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', ... ]
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!