【问题标题】:How to find file where function is defined from Python command line如何查找从 Python 命令行定义函数的文件
【发布时间】:2014-05-21 00:06:10
【问题描述】:

假设我想探索 Python 中的 import 语句。如何从 Python 命令行中找到定义 import 的文件?注意我在 Windows 7 中使用 Python 2.7.6 (iPython)。

对于大多数对象,只需输入对象名称即可。例如:

import os
os

产生以下结果:

<module 'os' from 'C:\Anaconda\lib\os.pyc'>

但是你不能对import这样的基本命令做同样的事情。

我已经尝试搜索我的 Python 文件夹,但不出所料,没有像 C:\Anaconda\lib\import.py 这样简单的东西。有没有一种简单的方法可以找出这些语句的定义位置(我意识到很多时候它会在 c 代码中,但这就是我所追求的)?

更新(2014 年 5 月 27 日)

似乎人们认为使用内置命令无法以任何简单的方式完成。但是,如果你的生活依赖它,你可以在 Python 中编写一些不优雅的 grep 类型函数,不是吗?

【问题讨论】:

  • 你不能。您使用的技巧适用于 modules,但 import 不是一个模块,而是一个语句。
  • @dano 你不能,句号,或者你不能像我试过的那样?
  • 我相信import 是用 C 实现的,所以你需要找到它在实际 Python 源代码中的位置。但是,从 Python 3.1 开始,有 importlib 模块,它提供了 import 的纯 Python 实现:docs.python.org/3/library/importlib.html
  • 所以没有办法从 Python 命令行中找出它定义在哪个 C 文件中?不知道为什么这被否决了......这是大多数 C/C++ IDE 让你很容易做到的事情。

标签: python file-location


【解决方案1】:

import 不像 os 那样是 module。相反,它是statement

https://docs.python.org/2/reference/simple_stmts.html#import

【讨论】:

  • 所以我的方法行不通,但是有没有办法找到定义导入的文件?是否在 Python 的 C 代码中,如果是,有没有办法从 python 命令行找到位置?
  • 你想知道的背景是什么? (这可能会导致不同的建议。)
  • 我想追踪实现一个功能的源代码,这样我就可以研究语言的内涵。这个例子实际上无关紧要。它可以是“打印”或任何其他命令。
  • 啊。修改上面发布的链接@dano,您可能需要查看hg.python.org/cpython/file/db302b88fdb6/Python 以了解各种内部实现。
  • 这很有帮助。我想知道的一个具体细节是关于如何在导入过程中使用 init.py 文件。
【解决方案2】:

当您在导入后调用os 时,它会打印文件的路径,因为它是一个模块。相反,import 是一个声明:

>>> import math
>>> math
<module 'math' from '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/math.so'>
>>> import
  File "<stdin>", line 1
    import
         ^
SyntaxError: invalid syntax
>>> 

以防万一你觉得你需要知道,这里有其他语句在被称为空白时会做类似的事情:

>>> with
  File "<stdin>", line 1
    with
       ^
SyntaxError: invalid syntax
>>> yield
  File "<stdin>", line 1
SyntaxError: 'yield' outside function
>>> return
  File "<stdin>", line 1
SyntaxError: 'return' outside function
>>> continue
  File "<stdin>", line 1
SyntaxError: 'continue' not properly in loop
>>> import
  File "<stdin>", line 1
    import
         ^
SyntaxError: invalid syntax
>>> raise
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: exceptions must be old-style classes or derived from BaseException, not NoneType
>>> assert
  File "<stdin>", line 1
    assert
         ^
SyntaxError: invalid syntax
>>> del
  File "<stdin>", line 1
    del
      ^
SyntaxError: invalid syntax
>>> break
  File "<stdin>", line 1
SyntaxError: 'break' outside loop
>>> 

【讨论】:

  • 是的,这就是 Ken 所说的:最初的问题是如何从 Python 中找到此类语句的源代码?这似乎并不简单,就像我写的那样,您基本上需要在 Python 中构建一个 grep 功能。
猜你喜欢
  • 1970-01-01
  • 2015-01-12
  • 2018-01-23
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2010-10-13
相关资源
最近更新 更多