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

StackOverflow https://stackoverflow.com/questions/3147823

  •  01-10-2019
  •  | 
  •  

这是一个随机问题,比任何特定需求都更加好奇。

是否可以编写一些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的内省功能,我很想知道它是否扩展到了这一水平。

有帮助吗?

解决方案

那是我得到的最接近的:

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

其他提示

是的,确实可以编写一个程序来输出其自己的来源。您甚至不需要内省的任务,您只需要能够打印计算的字符串(与每种语言一起使用)。

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

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

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

print open(__file__).read(),

我认为这将适用于UNIX系统,但我不确定Windows。尾随的逗号确保源代码已精确打印,而无需额外的尾随新线。

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

因此,简而言之,不,如果您的源代码来自标准输入,我认为这是不可能的。那里 可能 有可能将程序的解释形式访问为Python代码对象并将其转换回源形式,但是翻译的表单几乎肯定不会完全匹配原始文件内容。 (例如,评论和Shebang线肯定会被剥夺)。

您可以获得的最接近的是使用Readline询问命令历史记录,如果我可以看到的内容 例如 但是我怀疑这可能不包含在会话中管道的东西,而且无论如何都会适用于互动会话

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top