可以访问通过标准输入传递给Python的脚本源码吗?

4 投票
4 回答
1765 浏览
提问于 2025-04-16 00:37

这个问题有点随意,更多是出于好奇,而不是有什么具体的需求。

有没有可能写一些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

撰写回答