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

613 投票
22 回答
852788 浏览
提问于 2025-04-11 09:34

我该怎么查找某个Python模块的源文件安装在哪里呢?在Windows和Linux上这个方法会不一样吗?

我特别想找一下datetime模块的源代码,但我也想知道更一般的做法。

22 个回答

153

我知道这个回答晚了4年,但之前的答案可能会误导大家。

正确的方法是不要使用 __file__,也不要试图通过 sys.path 来查找自己,等等。(除非你需要兼容2.1之前的版本。)

应该使用 inspect 模块,特别是 getfilegetsourcefile

除非你想学习并实现一些规则(这些规则有文档说明,但对于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.73.3)。所以,一旦你发现 inspect.getfile(datetime) 是一个 .so.pyd 文件,比如 /usr/local/lib/python2.7/lib-dynload/datetime.so,你就可以在 Modules 目录中查找它。严格来说,没有办法确定哪个文件定义了哪个模块,但几乎所有的模块都是 foo.cfoomodule.c,所以你应该能猜到 datetimemodule.c 是你需要的文件。

271

在命令行中运行 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是什么!

461

对于一个纯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

撰写回答