首页 文章

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

提问于
浏览
401

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

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

16 回答

  • 8

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

  • 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
    ...
    

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

  • 196

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

    正确的方法是 __file__ ,或者试图通过 sys.path 并搜索自己等等(除非你需要向后兼容超过2.1) .

    这是inspect模块 - 尤其是 getfilegetsourcefile .

    除非你想学习和实现规则(对于CPython 2.x来说是有记录的,但是很痛苦,而对于其他实现没有记录,或3.x),以便将 .pyc 映射到 .py 文件;处理.zip档案,鸡蛋和模块包;尝试不同的方法来获取不支持 __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是你想要的 .

  • 4

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

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

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

  • 28

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

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

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

    从标准库试试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))
    
  • 0

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

  • 40

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

  • 10

    看看这个nifty "cdp" command cd到包含指定Python模块的源的目录:

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

    这是一个获取模块文件名的单行程序,适用于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
    
  • 6

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

  • 12

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

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

    当然,这不是通用的答案

  • 26

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

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

  • -1

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

  • 102

    您可以直接从git repository查看源代码 . 例如,这里是datetime module,作为奖励,subprocess module .

    如果你做更多的挖掘,你可以找到标准Python解释器的传统实现,它用'C'编写,也称为‘CPython’

相关问题