如何了解给定 Python 模块的源文件的安装位置?Windows 上的方法与 Linux 上的方法不同吗?
我正在尝试特别寻找datetime
模块的来源,但我也对更一般的答案感兴趣。
对于纯 python 模块,您可以通过查看themodule.__file__
. 然而,datetime 模块是用 C 编写的,因此datetime.__file__
指向一个 .so 文件(datetime.__file__
在 Windows 上没有),因此您看不到源代码。
如果您下载 python 源代码并解压,模块的代码可以在Modules子目录中找到。
例如,如果您想查找 python 2.6 的日期时间代码,您可以查看
Python-2.6/Modules/datetimemodule.c
您还可以在 https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c上找到最新的 Mercurial 版本
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 年,但现有的答案会误导人们。
做到这一点的正确方法是 never __file__
,或者尝试遍历sys.path
并搜索自己等(除非您需要向后兼容 2.1 之后的版本)。
它是inspect
模块——特别是,getfile
或getsourcefile
.
除非您想学习和实现映射.pyc
到.py
文件的规则(对于 CPython 2.x,这些规则已记录,但很痛苦,而对于其他实现或 3.x 则根本没有记录);处理 .zip 档案、egg 和模块包;尝试不同的方法来获取不支持的.so
/文件的路径;弄清楚 Jython/IronPython/PyPy 做了什么;等在这种情况下,去吧。.pyd
__file__
同时,从 2.0+ 开始的每个 Python 版本的源代码都可以在线获得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
or foomodule.c
,所以不难猜到datetimemodule.c就是你想要的。
如果您使用 pip 安装模块,则只pip show $module
返回位置。
该sys.path
列表包含将在运行时搜索模块的目录列表:
python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
从标准库尝试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'
这是获取模块文件名的单行代码,适用于 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
在 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'
等人
在windows上可以找到python模块的位置如下图:即find rest_framework module
Python 3.2 中的新功能,您现在可以使用code_info()
dis 模块中的示例:http:
//docs.python.org/dev/whatsnew/3.2.html#dis
查看这个漂亮的“cdp”命令以 cd 到包含指定 Python 模块源代码的目录:
cdp () {
cd "$(python -c "import os.path as _, ${1}; \
print _.dirname(_.realpath(${1}.__file__[:-1]))"
)"
}
在 Ubuntu 12.04 上,例如 python2 的 numpy 包,可以在以下位置找到:
/usr/lib/python2.7/dist-packages/numpy
当然,这不是通用的答案
从终端检查是否安装了多个 python 版本的另一种方法。
$ python3 -m pip show pyperclip
位置:/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-
$ python -m pip show pyperclip
位置:/Users/umeshvuyyuru/Library/Python/2.7/lib/python/site-packages
只是更新答案以防万一现在有人需要它,我在 Python 3.9 并使用 Pip 来管理包。只需使用pip show
,例如:
pip show numpy
它将为您提供所有详细信息以及 pip 存储所有其他包的位置。
并非所有的 python 模块都是用 python 编写的。Datetime 恰好是其中之一,并且(在 linux 上)是 datetime.so。
您必须将源代码下载到 python 标准库才能使用它。
对于那些喜欢 GUI 解决方案的人:如果您使用诸如 Spyder(Anaconda 安装的一部分)之类的 gui,您只需右键单击模块名称(例如“import csv”中的“csv”)并选择“go定义” - 这将打开文件,而且在顶部您可以看到确切的文件位置(“C:....csv.py”)
如果您不使用解释器,则可以运行以下代码:
import site
print (site.getsitepackages())
输出:
['C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']
Array 中的第二个元素将是您的包位置。在这种情况下:
C:\Users\<your username>\AppData\Local\Programs\Python\Python37\lib\site-packages
在像 Spyder 这样的 IDE 中,导入模块,然后单独运行模块。 在此处输入图像描述