我如何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.path
search自己,等等(除非你需要向后兼容2.1以上)。
这是inspect
模块,特别是getfile
或getsourcefile
。
除非您想要学习和实施将.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.c
或foomodule.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
当然,这不是一般的答案