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

我试图寻找datetime模块的源尤其是,但我感兴趣的更多常规的答案。

2008-11-06 18:36:52
问题评论:

回答:

对于纯 python 模块您可以通过查看themodule.__file__找到源。日期时间模块,但是,用 c 语言编写,和datetime.__file__指向.so 文件 (没有任何datetime.__file__在 Windows),因此,因此,您不能看到源。

如果您下载 python 源代码 tarball 并将其提取,模块子目录中可以找到模块的代码。

例如,如果您想要查找 python 2.6 的日期时间代码,您可以查看

Python-2.6/Modules/datetimemodule.c

此外可以在https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c网站上查找最新的 Mercurial 版本

如果您编辑您的答案,以表明该 datetime.__file__ (尽管 Windows 上日期时间模块对象不有任何文件属性) 指向.so Linux 和 Mac OS X 上,我将接受您的答案。

实际上在 Windows 上 (至少在版本上我使用),日期时间只是不具有的文件属性。

从命令行运行python -v应该告诉您正在导入内容在哪里。这适用于我在 Windows 和 Mac OS X。

C:>python -v
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# C:Python24libsite.pyc has bad mtime
import site # from C:Python24libsite.py
# wrote C:Python24libsite.pyc
# C:Python24libos.pyc has bad mtime
import os # from C:Python24libos.py
# wrote C:Python24libos.pyc
import nt # builtin
# C:Python24lib
tpath.pyc has bad mtime
...

我不知道这些坏 mtime 位于我安装 !

冷却 !在交互模式下以查看特定的 lib 来自出来后,还可以键入特定的导入语句中。

built-in模块的位置在哪里?

我意识到这答案是 4 年晚期,但现有的回答实际上在误导人们。

若要执行此操作的正确方法永远不会是__file__,或尝试遍历sys.path并搜索自己,等等 (除非您需要超过 2.1 的向后兼容)。

它是inspect模块 — — 在特定、 getfilegetsourcefile.

除非您想要了解并实施特定的规则 (这是有案可稽,但让人头痛,CPython 的 2.x,并没有为其他实现或 3.x 根本写) 为映射.pyc .py文件;处理.zip 存档,鸡蛋和模块包;尝试不同的方法来获取.so的路径 /.pyd文件中不支持__file__;搞清楚 Jython/IronPython/PyPy 的执行;等。在这种情况下,试试看吧。

同时,每个 Python 版本 2.0 + 中的源提供了在线http://hg.python.org/cpython/file/X.Y/ (即2.73.3)。因此,一旦发现该inspect.getfile(datetime)是类似/usr/local/lib/python2.7/lib-dynload/datetime.so .so.pyd文件,您可以查找它的模块目录内。严格地讲,有没有办法以确保哪些文件的定义的模块,但几乎全部是foo.cfoomodule.c,因此它不应该很难猜测该datetimemodule.c是您所需。

为什么是__file__不是适用于非 builtins?Sys.path 可以是令人头痛 (尤其是无需知道关于 meta_path),但 namespacing __file__定义和二进制文件之间有关问题,我理解爬网的位置吗?

我在 2.7.8 上的日期时间中这样做,只是获得 getfile 和 getsourcefile 的 TypeError。个人办的 python 安装多个版本,并且我需要知道哪个版本的 datetimemodule.c 它指向,因为现在我知道它已经不指向一个它应指向给定运行的解释器版本...

@mmitchell︰ 如果您将从 inspect.getfile(datetime) 获得 TypeError,假定日期时间实际的模块而不是其他已分配给相同的名称,我很肯定这意味着您所做的自定义生成以静态方式链接到该解释器,而不是使其成为一个可加载的模块的日期时间中。但是,可能有其他原因,我没有想到。您需要提出新的问题,并提供更多的信息,来重现这。

@mmitchell︰ 同时,没有没有办法找出哪个版本的 datetimemodule.c,它指向,因为它不指向 datetimemodule.c,它指向从 C 的文件; 生成的已编译模块C 文件可能不存在在您的系统上,可能因为您编译它,任何已编辑。

@tristan︰ 我不敢肯定我能理解您在问什么,但这也许会回答︰ 只要__file__工作, inspect.getfile的工作;没有,猜测是否使用__file__将成为比仅使用检查模块更好的情况。

datetime是内置模块,因此没有 (Python) 源代码文件。

对于来自.py (或.pyc) 文件的模块,您可以使用mymodule.__file__例如

> import random
> random.__file__
'C:Python25lib
andom.pyc'

sys.path列表包含该模块在运行时搜索的目录列表中︰

python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]

很好 !只我所寻找的内容。

python -c 'import sys; print " ".join(sys.path)'允许您查看它而无需放到交互式的 python。

请输入您的翻译

How do I find the location of Python module sources?

确认取消