如何了解安装给定Python模块的源文件的位置?Windows上的方法与Linux上的方法不同吗?
我正在努力寻找datetime
模块的来源,但我也对更一般的答案感兴趣.
对于纯python模块,您可以通过查看来查找源代码themodule.__file__
.但是,datetime模块是用C语言编写的,因此datetime.__file__
指向.so文件(datetime.__file__
Windows 上没有),因此您无法看到源代码.
如果您下载python源代码tarball并将其解压缩,则可以在Modules子目录中找到模块的代码.
例如,如果要查找python 2.6的日期时间代码,可以查看
Python-2.6/Modules/datetimemodule.c
您还可以在网站上找到最新的Mercurial版本: 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
搜索自己等等(除非你需要向后兼容超过2.1).
这是inspect
模块 - 特别是,getfile
或getsourcefile
.
除非你想要学习和实现规则(对于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.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
列表包含将在运行时搜索模块的目录列表:
python -v >>> import sys >>> sys.path ['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
如果您使用pip安装模块,则只pip show $module
返回位置.
从标准库中尝试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))
datetime
是一个内置模块,因此没有(Python)源文件.
对于来自.py
(或.pyc
)文件的模块,您可以使用mymodule.__file__
,例如
> import random > random.__file__ 'C:\\Python25\\lib\\random.pyc'
在python解释器中,您可以导入特定模块,然后键入help(module).这提供了详细信息,如名称,文件,模块文档,描述等.
例如:
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, e.g. unlink, stat, etc. - os.path is one of the modules posixpath, or ntpath - os.name is 'posix', 'nt', 'os2', 'ce' or 'riscos'
等
Python 3.2中的新功能,您现在可以使用例如code_info()
来自dis模块:http:
//docs.python.org/dev/whatsnew/3.2.html#dis
这是一个获取模块文件名的单行程序,适用于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 - "
使用:
$ getpmpath twisted /usr/lib64/python2.6/site-packages/twisted/__init__.pyc $ getpmpath twisted.web /usr/lib64/python2.6/site-packages/twisted/web/__init__.pyc
看看这个漂亮的"cdp"命令,cd到包含指定Python模块源代码的目录:
cdp () { cd "$(python -c "import os.path as _, ${1}; \ print _.dirname(_.realpath(${1}.__file__[:-1]))" )" }
在Windows上你可以找到python模块的位置,如下所示:即找到rest_framework模块