550

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

我正在尝试特别寻找datetime模块的来源,但我也对更一般的答案感兴趣。

4

19 回答 19

421

对于纯 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 版本

于 2008-11-06T18:45:33.897 回答
243

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 是什么!

于 2008-11-06T18:40:27.107 回答
137

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

做到这一点的正确方法是 never __file__,或者尝试遍历sys.path并搜索自己等(除非您需要向后兼容 2.1 之后的版本)。

它是inspect模块——特别是,getfilegetsourcefile.

除非您想学习和实现映射.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.73.3)。所以,一旦你发现它inspect.getfile(datetime)是一个.so.pyd类似的文件/usr/local/lib/python2.7/lib-dynload/datetime.so,你就可以在 Modules 目录中查找它。严格来说,没有办法确定哪个文件定义了哪个模块,但几乎所有文件都是foo.cor foomodule.c,所以不难猜到datetimemodule.c就是你想要的。

于 2012-12-15T00:31:15.427 回答
95

如果您使用 pip 安装模块,则只pip show $module返回位置。

于 2015-09-25T14:27:58.437 回答
78

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

python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
于 2008-11-06T18:39:52.880 回答
43

从标准库尝试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))
于 2013-05-04T02:40:30.887 回答
40

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

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

> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
于 2008-11-06T18:41:56.853 回答
14

这是获取模块文件名的单行代码,适用于 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
于 2013-03-04T21:35:24.243 回答
13

在 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'

等人

于 2011-04-21T06:39:13.180 回答
13

在windows上可以找到python模块的位置如下图:即find rest_framework module 在此处输入图像描述

于 2014-06-09T10:04:36.157 回答
11

Python 3.2 中的新功能,您现在可以使用code_info()dis 模块中的示例:http: //docs.python.org/dev/whatsnew/3.2.html#dis

于 2011-02-23T10:56:12.723 回答
10

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

cdp () {
  cd "$(python -c "import os.path as _, ${1}; \
    print _.dirname(_.realpath(${1}.__file__[:-1]))"
  )"
}
于 2010-04-27T17:22:07.900 回答
5

在 Ubuntu 12.04 上,例如 python2 的 numpy 包,可以在以下位置找到:

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

当然,这不是通用的答案

于 2016-06-22T14:18:30.427 回答
4

从终端检查是否安装了多个 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

于 2020-04-08T07:41:23.110 回答
4

只是更新答案以防万一现在有人需要它,我在 Python 3.9 并使用 Pip 来管理包。只需使用pip show,例如:

pip show numpy

它将为您提供所有详细信息以及 pip 存储所有其他包的位置。

于 2021-06-01T13:50:15.847 回答
1

并非所有的 python 模块都是用 python 编写的。Datetime 恰好是其中之一,并且(在 linux 上)是 datetime.so。

您必须将源代码下载到 python 标准库才能使用它。

于 2008-11-06T18:43:03.917 回答
1

对于那些喜欢 GUI 解决方案的人:如果您使用诸如 Spyder(Anaconda 安装的一部分)之类的 gui,您只需右键单击模块名称(例如“import csv”中的“csv”)并选择“go定义” - 这将打开文件,而且在顶部您可以看到确切的文件位置(“C:....csv.py”)

于 2014-12-01T14:00:13.047 回答
1

如果您不使用解释器,则可以运行以下代码:

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
于 2020-01-27T12:11:34.990 回答
0

在像 Spyder 这样的 IDE 中,导入模块,然后单独运行模块。 在此处输入图像描述

于 2020-04-06T13:43:50.710 回答