4

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

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

4 回答 4

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
于 2010-06-30T09:28:28.007 回答
3

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

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

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

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

于 2010-06-30T09:35:54.480 回答
1

print open(__file__).read(),

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

刚刚意识到(基于下面的评论)如果您的源代码来自sys.stdin,这正是您所要求的。在这种情况下,您可能会利用此页面上概述的一些关于 Python 中的 quines(打印自己的源代码的程序)的想法,但没有一个解决方案是一个可以正常工作的函数。与语言无关的讨论在这里

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

于 2010-06-30T09:12:56.787 回答
1

你能得到的最接近的是使用 readline 来询问命令历史记录(如果我可以看到的话),我怀疑这可能不包含通过管道传输到会话中的内容,并且无论如何只能用于交互式会话

于 2010-06-30T10:10:59.213 回答