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

时间:2008-11-06 18:36:53

标签: python module

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

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

19 个答案:

答案 0 :(得分:337)

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

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

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

Python-2.6/Modules/datetimemodule.c

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

答案 1 :(得分:204)

从命令行运行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是什么!

答案 2 :(得分:108)

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

执行此操作的正确方法绝不是__file__,或尝试遍历sys.path并搜索自己等等(除非您需要向后兼容超过2.1)。

这是inspect模块,尤其是getfilegetsourcefile

除非您想要学习和实施规则(对于CPython 2.x而言已经记录,但很痛苦,但在其他实现中没有记录,或3.x),以便将.pyc映射到{{ 1}}文件;处理.zip档案,鸡蛋和模块包;尝试不同的方法来获取不支持.py的{​​{1}} / .so个文件的路径;弄清楚Jython / IronPython / PyPy做了什么;在这种情况下,去吧。

同时,每个Python版本的2.0+源都可以在.pyd在线获取(例如,2.73.3)。因此,一旦您发现__file__http://hg.python.org/cpython/file/X.Y/inspect.getfile(datetime)文件,例如.so,您就可以在Modules目录中查找它。严格地说,没有办法确定哪个文件定义了哪个模块,但几乎所有模块都是.pyd/usr/local/lib/python2.7/lib-dynload/datetime.so,所以不应该猜测datetimemodule.c是你想要的。

答案 3 :(得分:58)

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

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

答案 4 :(得分:45)

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

答案 5 :(得分:29)

来自标准库的

尝试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))

答案 6 :(得分:28)

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

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

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

答案 7 :(得分: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'

答案 8 :(得分:10)

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

答案 9 :(得分:9)

查看此nifty "cdp" command以cd到包含指定Python模块的源的目录:

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

答案 10 :(得分: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

答案 11 :(得分:6)

在Windows上你可以找到python模块的位置,如下所示:即找到rest_framework模块 enter image description here

答案 12 :(得分:4)

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

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

当然,这不是通用答案

答案 13 :(得分:2)

如果现在有人需要它,只需更新答案,我使用 Python 3.9 并使用 Pip 来管理包。 只需在 cmd 中输入:-

pip show any-module-name-you-remember-installing

例如:- pip 显示 numpy

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

答案 14 :(得分:1)

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

-MBP:〜python3 -m pip显示pyperclip

位置:/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-

MBP:〜python -m pip显示pyperclip

位置:/Users/umeshvuyyuru/Library/Python/2.7/lib/python/site-packages

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

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

答案 17 :(得分:0)

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

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

数组中的第二个元素将是您的包位置。在这种情况下:

C:\Users\<your username>\AppData\Local\Programs\Python\Python37\lib\site-packages

答案 18 :(得分:-1)

在Spyder之类的IDE中,导入模块,然后分别运行模块。 enter image description here