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

我如何了解一个给定的Python模块的源文件安装在哪里?Windows上的方法和Linux上的方法不同吗?

我试图寻找datetime模块的来源,特别是,但我对一个更一般的答案感兴趣。

757358 次浏览

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

python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]

从命令行运行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
...

我不知道我安装的那些不好的时光网是什么!

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

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

> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'

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

你必须将源代码下载到python标准库才能得到它。

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

如果你下载一个python源tarball并提取它,模块的代码可以在模块子目录中找到。

例如,如果你想找到python 2.6的datetime代码,你可以查看

Python-2.6/Modules/datetimemodule.c
你也可以在github上找到这个文件的最新版本 # EYZ0 < / p >

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

cdp () {
cd "$(python -c "import os.path as _, ${1}; \
print _.dirname(_.realpath(${1}.__file__[:-1]))"
)"
}
Python 3.2中的新功能,你现在可以使用dis模块中的code_info(): # EYZ0 < / p >

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

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

正确的方法永远不是__file__,或者尝试通过sys.path来搜索自己,等等(除非你需要向后兼容2.1以上的版本)。

它是inspect模块——特别是getfilegetsourcefile

除非你想学习和实现CPython 2的规则(这些规则有文档,但很痛苦)。3.x)用于将.pyc映射到.py文件;处理.zip档案、eggs和模块包;尝试不同的方法来获取不支持__file__.so/.pyd文件的路径;弄清楚Jython/IronPython/PyPy做什么;等。在这种情况下,放手去做吧。

同时,从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.cfoomodule.c,所以应该不难猜测datetimemodule.c就是您想要的模块。

下面是一行代码获取模块的文件名,适用于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

从标准库尝试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))
在windows上,你可以找到python模块的位置,如下所示:E找到rest_framework模块 enter image description here

对于那些更喜欢GUI解决方案的人:如果你正在使用GUI,如Spyder (Anaconda安装的一部分),你可以右键单击模块名称(如“import csv”中的“csv”),并选择“go to definition”-这将打开文件,但在顶部你可以看到确切的文件位置(“C:....csv.py”)

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

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

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

当然,这不是一般的答案

如果你没有使用解释器,那么你可以运行下面的代码:

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中,导入模块,然后单独运行模块。 # EYZ0 < / p >

另一种从终端检查是否安装了多个python版本的方法。

# EYZ0

地点:/图书馆/框架/ Python.framework /版本/ 3.7 / lib / python3.7 /网站

# EYZ0

地点:/用户/ umeshvuyyuru /图书馆/ Python / 2.7 / lib / Python /网站

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

pip show numpy

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

如上所述 在python中只使用help(模块) 即< / p >

进口分数

帮助(分数)

如果你的模块,在例子中的分数,被安装,然后它会告诉你的位置和有关它的信息,如果它没有安装,它说模块不可用

如果它不可用,默认情况下python不会附带,在这种情况下,你可以检查你在哪里找到它的下载信息