如何找到Python模块源的位置?

Dar*_*zer 454 python module

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

我正在努力寻找datetime模块的来源,但我也对更一般的答案感兴趣.

Moe*_*Moe 362

对于纯python模块,您可以通过查看来查找源代码themodule.__file__.但是,datetime模块是用C语言编写的,因此datetime.__file__指向.so文件(datetime.__file__Windows 上没有),因此您无法看到源代码.

如果您下载python源代码tarball并将其解压缩,则可以在Modules子目录中找到模块的代码.

例如,如果要查找python 2.6的日期时间代码,可以查看

Python-2.6/Modules/datetimemodule.c
Run Code Online (Sandbox Code Playgroud)

您还可以在网站上找到最新的Mercurial版本: https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c


jbl*_*som 212

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
...
Run Code Online (Sandbox Code Playgroud)

我不确定那些糟糕的mtime是什么在我的安装上!

  • 凉!在交互模式下打开后,您还可以键入自己的特定import语句,以查看特定lib的来源. (7认同)
  • "内置"模块在哪里? (3认同)

aba*_*ert 115

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

做到这一点的正确方法是永远不要__file__,或者试图通过sys.path搜索自己等等(除非你需要向后兼容超过2.1).

这是inspect模块 - 特别是,getfilegetsourcefile.

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

  • 为什么`__file__`不适用于非内置函数?我理解爬行sys.path可能会很痛苦(尤其是在不知道meta_path的情况下),但是您对`__file__`定义和二进制文件之间的命名空间有什么关系? (3认同)
  • 我在 2.7.8 的 datetime 中执行此操作,只是得到 getfile 和 getsourcefile 的 TypeError 。就我个人而言,我安装了多个版本的 python,我需要知道它指向的是 datetimemodule.c 的哪个版本,因为现在我知道它没有指向它应该指向的版本(给定正在运行的解释器版本)... (2认同)

Gre*_*ill 64

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

python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
Run Code Online (Sandbox Code Playgroud)

  • ```python -c'import sys; print"\n".join(sys.path)'```让你无需进入交互式python即可查看它. (10认同)
  • Python 3:`python -c'import sys; print(“ \ n” .join(sys.path))'` (3认同)

小智 53

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

  • (我认为`$ module`意味着占位符变量,而不是人们会输入的字体.例如,`m = numpy; pip show $ m` ...等,对于任何`m`) (10认同)
  • 没有美元符号给我.例如`pip show numpy` (9认同)
  • 实际上,如果你安装了多个Python,这种方法并不可靠,因为从shell执行的“pip”可能与Python中调用的不同。相反,你应该执行“python -m pip show $module”。请参阅[umesh的答案](/sf/ask/18885681/#61095592)。 (3认同)

Cod*_*ced 32

从标准库中尝试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))
Run Code Online (Sandbox Code Playgroud)

  • 现在python3需要这样使用。`import importlib` 然后 `importlib.util.find_spec('fontTools')` (6认同)

Bja*_*ert 31

datetime 是一个内置模块,因此没有(Python)源文件.

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

> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
Run Code Online (Sandbox Code Playgroud)


Vij*_*jay 12

在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'
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 10

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


Ern*_*est 10

这是一个获取模块文件名的单行程序,适用于shell别名:

echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)'  | python - 
Run Code Online (Sandbox Code Playgroud)

设置为别名:

alias getpmpath="echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)'  | python - "
Run Code Online (Sandbox Code Playgroud)

使用:

$ getpmpath twisted
/usr/lib64/python2.6/site-packages/twisted/__init__.pyc
$ getpmpath twisted.web
/usr/lib64/python2.6/site-packages/twisted/web/__init__.pyc
Run Code Online (Sandbox Code Playgroud)


Dar*_*zer 9

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

cdp () {
  cd "$(python -c "import os.path as _, ${1}; \
    print _.dirname(_.realpath(${1}.__file__[:-1]))"
  )"
}
Run Code Online (Sandbox Code Playgroud)


vub*_*vub 9

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


小智 9

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

pip show numpy
Run Code Online (Sandbox Code Playgroud)

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


Dun*_*523 7

在Windows上你可以找到python模块的位置,如下所示:即找到rest_framework模块 在此输入图像描述


nex*_*ayq 5

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

/usr/lib/python2.7/dist-packages/numpy
Run Code Online (Sandbox Code Playgroud)

当然,这不是通用的答案