可以访问通过标准输入传递给Python的脚本源码吗?
这个问题有点随意,更多是出于好奇,而不是有什么具体的需求。
有没有可能写一些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 个回答
1
你能做到的最接近的方式是使用readline来查看命令历史记录,如果有的话。从我看到的资料来看,比如说,但是我怀疑这可能不包括在会话中通过管道传入的内容,而且只适用于交互式会话。
2
是的,确实可以写一个程序,让它输出自己的源代码。你甚至不需要复杂的检查,只要能打印出计算出来的字符串就行(这在任何编程语言中都适用)。
这个技巧叫做Quine,下面是一个用Python写的简单例子:
quine = 'quine = %r\r\nprint quine %% quine'
print quine % quine
不过,Quine可不仅仅是这么简单的程序。它们可以做更多的事情,比如反向打印自己的源代码等等…… :)
3
这是我能做到的最接近的结果:
echo 'import __main__,inspect;print inspect.getsource(__main__)' | python
但是这个方法失败了……无论如何,原始代码在启动时就被解释器读取了(从标准输入中)。最多你可能只能通过 __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