如何找到 Python 模块源的位置?[重复]
- 2025-02-12 10:03:00
- admin 原创
- 44
问题描述:
如何了解给定 Python 模块的源文件安装在哪里?Windows 和 Linux 上的方法是否不同?
我正在尝试寻找该datetime
模块的具体来源,但我也对更一般的答案感兴趣。
解决方案 1:
对于纯 Python 模块,您可以通过查看来找到源代码themodule.__file__
。但是,datetime 模块是用 C 编写的,因此datetime.__file__
指向 .so 文件(Windows 上没有datetime.__file__
),因此您看不到源代码。
如果您下载 python 源代码 tarball 并解压它,则可以在Modules子目录中找到模块的代码。
例如,如果你想找到 Python 2.6 的日期时间代码,你可以查看
Python-2.6/Modules/datetimemodule.c
您还可以在 github 上找到该文件的最新版本,网址为
https://github.com/python/cpython/blob/main/Modules/_datetimemodule.c
解决方案 2:
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 是什么!
解决方案 3:
我意识到这个答案晚了4年,但是现有的答案正在误导人们。
正确的做法是永远不要这样做__file__
,或者尝试自己浏览sys.path
并搜索等等(除非您需要向后兼容 2.1 以外的版本)。
它是inspect
模块—特别是,getfile
或者getsourcefile
。
除非您想学习和实施规则(对于 CPython 2.x,这些规则已记录在案,但很痛苦,而对于其他实现或 3.x,根本没有记录)以映射.pyc
到文件;处理 .zip 档案、eggs 和模块包;尝试不同的方法来获取不支持的/文件.py
的路径;弄清楚 Jython/IronPython/PyPy 的作用;等等。在这种情况下,去做吧。.so
`.pyd`__file__
同时,每个 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就是您想要的。
解决方案 4:
如果您使用 pip 安装模块,则pip show $module
只会返回位置。
解决方案 5:
该sys.path
列表包含在运行时搜索模块的目录列表:
python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
解决方案 6:
从标准库尝试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))
解决方案 7:
datetime
是一个内置模块,因此没有(Python)源文件。
对于来自.py
(或.pyc
)文件的模块,您可以使用mymodule.__file__
,例如
> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
解决方案 8:
下面是获取模块文件名的一行程序,适用于 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
解决方案 9:
在 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'
等人
解决方案 10:
在windows上,你可以找到python模块的位置,如下所示:即找到rest_framework模块
解决方案 11:
Python 3.2 中的新功能,您现在可以使用code_info()
dis 模块:
http: //docs.python.org/dev/whatsnew/3.2.html#dis
解决方案 12:
查看这个漂亮的“cdp”命令,以 cd 到包含指示 Python 模块源的目录:
cdp () {
cd "$(python -c "import os.path as _, ${1}; \n print _.dirname(_.realpath(${1}.__file__[:-1]))"
)"
}
解决方案 13:
只是更新答案以防现在有人需要它,我在 Python 3.9 中使用 Pip 来管理包。只需使用pip show
,例如:
pip show numpy
它将为您提供 pip 存储所有其他包的位置的所有详细信息。
解决方案 14:
另一种方法是从终端检查是否安装了多个 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
解决方案 15:
例如,在 Ubuntu 12.04 上,可以在以下位置找到适用于 python2 的 numpy 包:
/usr/lib/python2.7/dist-packages/numpy
当然,这不是一般的答案
解决方案 16:
您可以根据需要在 pyCharm 或其他编辑器上运行它
import module_name
print(module_name)
这将显示您的模块的位置。
解决方案 17:
并非所有 Python 模块都是用 Python 编写的。Datetime 恰好是其中之一,并且(在 Linux 上)是 datetime.so。
您必须下载源代码到 Python 标准库才能获取它。
解决方案 18:
对于那些喜欢 GUI 解决方案的人:如果您使用 Spyder 等 GUI(Anaconda 安装的一部分),您只需右键单击模块名称(例如“import csv”中的“csv”)并选择“转到定义” - 这将打开文件,但在顶部您还可以看到确切的文件位置(“C:....csv.py”)
解决方案 19:
如果您不使用解释器,那么您可以运行以下代码:
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>AppDataLocalProgramsPythonPython37libsite-packages
解决方案 20:
受到这个答案的启发。
利用grep
和awk
工具。我发现这在 bash shell 中有效。
pip show <any-installed-package> | grep Location | awk -F': ' '{print $2}'
这个想法是在结果中过滤模块路径。
$pip show pygments
Name: Pygments
Version: 2.16.1
Summary: Pygments is a syntax highlighting package written in Python.
Home-page: None
Author: None
Author-email: Georg Brandl <georg@python.org>
License: BSD-2-Clause
Location: $USER/.local/lib/python3.8/site-packages
Requires:
解决方案 21:
在 Spyder 等 IDE 中,导入模块,然后单独运行模块。
在此处输入图像描述
解决方案 22:
正如上面在 python 中写的那样,只需使用 help(module) 即
进口部分
帮助(分数)
如果你的模块(例如分数)已安装,那么它会告诉你它的位置和相关信息,如果没有安装,它会说模块不可用
如果它不可用,则默认情况下它不会随 python 一起提供,在这种情况下,您可以检查在哪里找到它的下载信息