【问题标题】:How do I find the location of Python module sources?如何找到 Python 模块源的位置?
【发布时间】:2010-09-21 03:39:22
【问题描述】:

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

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

【问题讨论】:

    标签: python module


    【解决方案1】:

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

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

    【讨论】:

    • python -c 'import sys; print "\n".join(sys.path)' 让您无需进入交互式 python 即可查看它。
    • Python 3:python -c 'import sys; print("\n".join(sys.path))'
    【解决方案2】:

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

    【讨论】:

    • 酷!您还可以在以交互模式打开后输入您自己的特定导入语句,以查看特定库的来源。
    • built-in 模块在哪里?
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • Daryl:你误解了 Jim 的回答,“日期时间恰好是不是用 python 编写的 python 模块之一”。
      【解决方案5】:

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

      【讨论】:

      • 如果您编辑答案以表明 datetime.__file__ 在 Linux 和 Mac OS X 上指向 .so(尽管在 Windows 上 datetime 模块对象没有 file 属性) ,我会接受你的回答。
      • 实际上在 Windows 上(至少在我使用的版本上), datetime 只是没有 file 属性。
      【解决方案6】:

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

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

      【讨论】:

      • 谢谢!这正是我一直在寻找的。奇怪的是,他们不会在 python 发行版中包含类似的东西。
      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

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

        【讨论】:

        • 这给了我模块文件的完整路径,而其他答案只给出了相对路径。谢谢。
        【解决方案9】:

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

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

        它是inspect 模块,特别是getfilegetsourcefile

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

        【讨论】:

        • 为什么__file__ 不适用于非内置函数?我知道在哪里爬 sys.path 会很痛苦(尤其是在不了解 meta_path 的情况下),但是您是否担心 __file__ 定义和二进制文件之间的命名空间?
        • 我在日期时间的 2.7.8 中执行此操作,但 getfile 和 getsourcefile 都出现了 TypeError。就我个人而言,我安装了多个版本的 python,我需要知道它指向哪个版本的 datetimemodule.c,因为现在我知道它没有指向它应该指向的那个,因为正在运行的解释器版本......跨度>
        • @mmitchell:如果你从 inspect.getfile(datetime) 得到一个 TypeError,假设 datetime 实际上是模块而不是你分配给同名的其他东西,我很确定这意味着您进行了自定义构建以将日期时间静态链接到解释器,而不是使其成为可加载模块。但可能还有其他我没有想到的原因。您需要提出一个新问题,并提供更多信息来重现此问题。
        • @mmitchell:同时,没有办法找出它指向哪个版本的 datetimemodule.c,因为它不是指向 datetimemodule.c,而是指向从该 C 文件构建的编译模块; C 文件可能在您的系统上不存在,可能在您编译后已被编辑,无论如何。
        • 是的,我知道编译是如何工作的,为了与您的答案保持一致,我选择了“.c”。 ;) 我也没有期待我的问题得到完整的解决方案,只是指出你的答案不起作用。我在 2.7.8 的干净、香草安装上进行了测试,并得到了错误,因此它与自定义内容无关——它在 Windows 上不起作用。
        【解决方案10】:

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

        【讨论】:

        • 第一个版本错误,反斜杠太多。从 shell 脚本,这对我有用:echo 'import sys; t=__import__(sys.argv[1],fromlist=["."]); print(t.__file__)' | python - "$@"
        【解决方案11】:

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

        【讨论】:

        • 这太棒了。我apt-get remove'd DataDog 并且仍然可以导入它。当其他解决方案没有帮助时,这有助于我找到文件的位置(以便我可以删除它们)。
        • 对于 python3.x,imp 包已被弃用(自 3.4 版起),取而代之的是 importlib(自 3.1 版起)docs.python.org/3.6/library/imp.html
        • 现在python3需要这样使用。 import importlib 然后importlib.util.find_spec('fontTools')
        【解决方案12】:

        在windows上你可以找到python模块的位置,如下图所示:即找到rest_framework模块

        【讨论】:

          【解决方案13】:

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

          【讨论】:

            【解决方案14】:

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

            【讨论】:

            • (我认为$module 是一个占位符变量,而不是字面上的类型。例如,m=numpy; pip show $m ...等,对于任何m
            • 这应该被标记为所提问题的最准确答案。
            • 实际上,如果你安装了多个python,这种方法是不可靠的,因为从shell执行的pip可能与python中调用的不是同一个。相反,您应该使用python -m pip show $module。见umesh's answer
            【解决方案15】:

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

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

            当然,这不是通用答案

            【讨论】:

              【解决方案16】:

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

              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
              

              【讨论】:

                【解决方案17】:

                在像 Spyder 这样的 IDE 中,导入模块,然后单独运行模块。 enter image description here

                【讨论】:

                • 导入并打印模型的str() 更准确地描述了您在屏幕截图中所做的事情,而且 IDE 似乎与此解决方案无关
                • 欢迎来到 StackOverflow!请不要使用图像发布代码。图像难以阅读,无法搜索,并且某些读者无法查看。相反,请将任何相关代码直接包含在您的答案正文中。
                【解决方案18】:

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

                【讨论】:

                  【解决方案19】:

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

                  pip show numpy
                  

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2013-02-09
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-12-09
                    • 2019-02-04
                    • 2012-08-14
                    相关资源
                    最近更新 更多