代码之家  ›  专栏  ›  技术社区  ›  DrAl

是否可以访问标准中传递给python的python脚本的源代码?

  •  3
  • DrAl  · 技术社区  · 14 年前

    这是一个有点随机的问题,比任何特定的需求都更出于好奇。

    是否可以编写一些可以打印一些内容的Python代码,包括源代码本身,而不将Python代码存储在文件中?例如,在bash提示下执行类似的操作:

    $ echo '
    > print "The Code:"
    > PrintScript() # What would this function look like?
    > for i in range(5):
    >     print i,
    > print "!"
    > ' | python
    

    得到这样的输出:

    The Code:
    print "The Code:"
    PrintScript() # What would this function look like?
    for i in range(5):
        print i,
    print "!"
    0 1 2 3 4 5 !
    

    我怀疑这可能无法完成,但是考虑到Python的内省能力,我很好奇它是否扩展到了这个级别。

    4 回复  |  直到 14 年前
        1
  •  2
  •   Wim    14 年前

    这是我最近得到的:

    echo 'import  __main__,inspect;print inspect.getsource(__main__)' | python
    

    失败了…在任何情况下,解释器在启动时都会吃掉原始代码(从stdin读取)。最多您可以通过 __main__ 模块。

    更新:

    这个 dis 模块应该为您提供一个模块中所有函数的反汇编,但即使这个模块没有看到任何代码:

    $ echo -e 'import  __main__,dis;print dis.dis(__main__)' | python
    None
    

    甚至当我抛出一个函数时:

    $ echo -e "import  __main__,dis;print dis.dis(__main__)\ndef x():\n pass" | python
    None
    
        2
  •  3
  •   tux21b    14 年前

    是的,确实可以编写一个输出自己源代码的程序。您甚至不需要为此任务进行内省,只需要能够打印计算字符串(适用于每种语言)。

    这项技术被称为 Quine 在python中有一个很短的例子:

    quine = 'quine = %r\r\nprint quine %% quine'
    print quine % quine
    

    但奎因不仅仅局限于这么简单的节目。他们可以做得更多,例如向后打印自己的源代码等等…:)

        3
  •  1
  •   Tamás    14 年前

    print open(__file__).read(),
    

    我认为这可以在Unix系统上使用,但我不确定Windows。尾随逗号确保源代码准确打印,没有额外的尾随换行符。

    刚刚意识到(基于下面的注释)如果源代码来自 sys.stdin 这正是你想要的。在这种情况下,您可以利用 this page 关于python中的quines(程序打印自己的源代码),但是所有的解决方案都不是一个只起作用的函数。独立于语言的讨论是 here .

    所以,简而言之,不,如果源代码来自标准输入,我不认为用一个函数就可以做到这一点。那里 可以 可以将程序的解释形式作为一个python代码对象来访问,并将其转换回源格式,但转换后的格式几乎肯定与原始文件内容不完全匹配。(例如,评论和shebang行肯定会被删除)。

        4
  •  1
  •   jk.    14 年前

    你能得到的最接近的是使用readline来询问命令历史,如果我能从中看到的话。 e.g. 但我怀疑这可能不包含导入会话的内容,而且只适用于交互式会话。