这是一个随机问题,更多是出于好奇而不是任何具体需要。
是否可以编写一些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的内省功能,我很想知道它是否扩展到这个级别。
答案 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.,但我怀疑这可能不包含管道进入会话的内容,并且只能用于交互式会话