如何找到Python模块源代码的位置?
我该怎么查找某个Python模块的源文件安装在哪里呢?在Windows和Linux上这个方法会不一样吗?
我特别想找一下datetime
模块的源代码,但我也想知道更一般的做法。
22 个回答
我知道这个回答晚了4年,但之前的答案可能会误导大家。
正确的方法是不要使用 __file__
,也不要试图通过 sys.path
来查找自己,等等。(除非你需要兼容2.1之前的版本。)
应该使用 inspect
模块,特别是 getfile
或 getsourcefile
。
除非你想学习并实现一些规则(这些规则有文档说明,但对于CPython 2.x来说比较复杂,其他版本或3.x则没有文档),比如如何将 .pyc
文件映射到 .py
文件;处理 .zip 压缩包、egg 文件和模块包;尝试不同的方法来获取不支持 __file__
的 .so
/.pyd
文件的路径;弄清楚 Jython/IronPython/PyPy 的工作方式等等。如果你想这样做,那就去吧。
同时,从2.0版本开始,每个Python版本的源代码都可以在 http://hg.python.org/cpython/file/X.Y/
在线获取(例如,2.7 或 3.3)。所以,一旦你发现 inspect.getfile(datetime)
是一个 .so
或 .pyd
文件,比如 /usr/local/lib/python2.7/lib-dynload/datetime.so
,你就可以在 Modules 目录中查找它。严格来说,没有办法确定哪个文件定义了哪个模块,但几乎所有的模块都是 foo.c
或 foomodule.c
,所以你应该能猜到 datetimemodule.c 是你需要的文件。
在命令行中运行 python -v
可以告诉你正在导入哪些东西,以及它们来自哪里。这在我的Windows和Mac OS X上都能正常工作。
C:\>python -v
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# C:\Python24\lib\site.pyc has bad mtime
import site # from C:\Python24\lib\site.py
# wrote C:\Python24\lib\site.pyc
# C:\Python24\lib\os.pyc has bad mtime
import os # from C:\Python24\lib\os.py
# wrote C:\Python24\lib\os.pyc
import nt # builtin
# C:\Python24\lib\ntpath.pyc has bad mtime
...
我不太确定我安装的那些坏的mtime是什么!
对于一个纯Python模块,你可以通过查看 themodule.__file__
来找到它的源代码。不过,datetime模块是用C语言写的,所以 datetime.__file__
指向一个 .so 文件(在Windows上没有 datetime.__file__
),因此你无法看到它的源代码。
如果你下载一个Python的源代码压缩包并解压,你可以在 Modules 子目录中找到模块的代码。
举个例子,如果你想找到Python 2.6的datetime代码,可以查看
Python-2.6/Modules/datetimemodule.c
你也可以在网上的github上找到这个文件的最新版本,地址是 https://github.com/python/cpython/blob/main/Modules/_datetimemodule.c