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

时间:2010-06-30 09:05:16

标签: python stdin quine

这是一个随机问题,更多是出于好奇而不是任何具体需要。

是否可以编写一些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 个答案:

答案 0 :(得分:3)

是的,确实可以编写一个输出它自己的源程序。你甚至不需要对这个任务进行内省,你只需要能够打印计算字符串(适用于所有语言)。

该技术称为Quine,这是Python中的一个相当简短的例子:

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

但是quines并不仅限于这样简单的程序。他们可以做更多事情,例如向后打印他们自己的来源等等......:)

答案 1 :(得分:2)

这是我最接近的:

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 :(得分:1)

print open(__file__).read(),

我认为这适用于UNIX系统,但我不确定Windows。尾随逗号确保源代码打印完全,没有额外的尾随换行符。

刚刚意识到(根据下面的评论)如果您的源代码来自sys.stdin,这不起作用,这正是您所要求的。在这种情况下,您可以利用this page中概述的关于quines(程序打印自己的源代码)的一些想法,但是没有一个解决方案是单一的功能。与语言无关的讨论是here

所以,简而言之,不,如果您的源代码来自标准输入,我认为单个函数不可能实现这一点。 可能可以作为Python代码对象访问程序的解释形式,并将其转换回源代码形式,但翻译后的形式几乎肯定不会与原始文件内容完全匹配。 (例如,评论和shebang线肯定会被剥夺)。

答案 3 :(得分:1)

最接近你可以使用readline来查询命令历史记录,如果我可以看到e.g.,但我怀疑这可能不包含管道进入会话的内容,并且只能用于交互式会话