我如何findPython模块源的位置?

我如何知道给定Python模块的源文件的安装位置? Windows上的方法与Linux上不同吗?

我试图寻找特别的datetime模块的来源,但我更感兴趣的是更一般的答案。

对于纯Python模块,您可以通过查看themodule.__file__find源代码。 但是,date时间模块是用C编写的,因此datetime.__file__文件datetime.__file__指向.so文件(在Windows上没有datetime.__file__ ),因此您看不到源文件。

如果你下载了一个python源代码压缩包并将其解压缩,模块的代码可以在Modules子目录中find。

例如,如果你想查找Python 2.6的date时间代码,你可以看看

 Python-2.6/Modules/datetimemodule.c 

您也可以在网站上find最新的Mercurial版本,url为https://hg.python.org/cpython/file/tip/Modules/_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是在我的安装!

我意识到这个答案迟了4年,但现有的答案是误导人。

正确的做法是从不__file__ ,或者试图通过sys.pathsearch自己,等等(除非你需要向后兼容2.1以上)。

这是inspect模块,特别是getfilegetsourcefile

除非您想要学习和实施将.pyc映射到.py文件的规则(对于CPython 2.x有logging,但是痛苦,对其他实现或3.x则没有logging); 处理.zip档案,鸡蛋和模块包; 尝试不同的方法来获取不支持__file__ .so / .pyd文件的path; 搞清楚Jython / IronPython / PyPy做什么; 在这种情况下,去做吧。

同时,来自2.0+的每个Python版本的源代码可以在http://hg.python.org/cpython/file/XY/ (例如2.7或3.3 )上在线获得。 因此,一旦发现inspect.getfile(datetime).so.pyd文件(如/usr/local/lib/python2.7/lib-dynload/datetime.so ,您可以在Modules目录中查找它。 严格来说,没有办法确定哪个文件定义了哪个模块,但几乎所有的模块都是foo.cfoomodule.c ,所以不应该很难猜测datetimemodule.c是你想要的。

sys.path列表包含在运行时将search模块的目录列表:

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

datetime是一个内置模块,所以没有(Python)源文件。

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

 > import random > random.__file__ 'C:\\Python25\\lib\\random.pyc' 

从标准库中试试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)) 

如果你使用pip来安装你的模块,只需要pip show $module返回的位置。

Python 3.2中的新增function,现在可以使用dis模块中的code_info() : http : code_info()

在Python解释器中,您可以导入特定的模块,然后键入help(模块)。 这提供了诸如名称,文件,模块文档,描述等细节。

例如:

 import os help(os) Help on module os: NAME os - OS routines for Mac, NT, or Posix depending on what system we're on. FILE /usr/lib/python2.6/os.py MODULE DOCS http://docs.python.org/library/os DESCRIPTION This exports: - all functions from posix, nt, os2, or ce, eg unlink, stat, etc. - os.path is one of the modules posixpath, or ntpath - os.name is 'posix', 'nt', 'os2', 'ce' or 'riscos' 

等人

查看这个漂亮的“cdp”命令 ,进入包含指定Python模块源代码的目录:

 cdp () { cd "$(python -c "import os.path as _, ${1}; \ print _.dirname(_.realpath(${1}.__file__[:-1]))" )" } 

下面是一个模块的文件名,适用于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 - " 

使用:

 [buildbot@domU-12-31-39-0A-9C-B8 ~]$ getpmpath twisted /usr/lib64/python2.6/site-packages/twisted/__init__.pyc [buildbot@domU-12-31-39-0A-9C-B8 ~]$ getpmpath twisted.web /usr/lib64/python2.6/site-packages/twisted/web/__init__.pyc 

在Windows上,你可以findpython模块的位置,如下所示:即findrest_framework模块 在这里输入图像描述

并不是所有的python模块都是用python编写的。 date时间恰好是其中之一,而(在Linux上)是datetime.so。

你将不得不将源代码下载到Python标准库来获取它。

对于那些更喜欢GUI解决scheme的用户:如果你使用的是Spyder(Anaconda安装的一部分),你可以右键单击模块名称(例如“import csv”中的“csv”)并select“go定义“ – 这将打开文件,而且在顶部,你可以看到确切的文件位置(”C:…. csv.py“)

在Ubuntu 12.04上,例如python2的numpy包可以在以下urlfind:

 /usr/lib/python2.7/dist-packages/numpy 

当然,这不是一般的答案