【问题标题】:Python script that prints its source打印其源代码的 Python 脚本
【发布时间】:2013-08-20 02:19:30
【问题描述】:

是否可以(不必使用 python 自省)打印脚本的源代码?

我想执行一个简短的 python 脚本,它也打印它的源代码(这样我就可以看到执行了哪些命令)。

脚本是这样的:

command1()
#command2()
command3()

print some_variable_that_contain_src

真正的应用是我想使用run -i 魔法从 IPython 运行一个脚本,并将源(即执行的命令)作为输出。通过这种方式,我可以检查每次执行时注释了哪些命令。此外,如果在笔记本中执行,我会留下使用过哪些命令的痕迹。

解决方案

使用 korylprince 解决方案,我最终将这个单行代码放在脚本的开头:

with open(__file__) as f: print '\n'.join(f.read().split('\n')[1:])

这将打印除第一行之外的脚本源(那只是噪音)。修改切片以打印脚本的不同“切片”也很容易。

如果您想打印整个文件,单行简化为:

with open(__file__) as f: print f.read()

【问题讨论】:

  • 也许可以查看 python 中的检查包:python.org/doc//current/library/inspect.html。特别是getsource 方法
  • 这类程序称为Quine程序。 en.wikipedia.org/wiki/Quine_(computing)我正在尝试自己用python写一个,太难了。 :(
  • 为什么要去掉第一行?您会得到一个脚本,该脚本在运行时会打印出不包含任何有关打印其源代码的任何内容的源代码。这很令人困惑。第一行不是噪音,正如 cmets 或断言是噪音一样。
  • @user2357112:这是抽象正交性与实际便利性的问题。我只想对某些数据分析中使用的命令有视觉反馈。我丢弃了所有不感兴趣的部分以获得更清晰的输出。

标签: python


【解决方案1】:

只要你没有对包做任何疯狂的事情,就把它放在你脚本的顶部

with open(__file__) as f:
    print f.read()

读取当前文件并打印出来。

对于 python 3,请确保使用 print(f.read())

【讨论】:

  • 是的,只有放在脚本开头才有效。如果放在最后并执行其他脚本,则会打印最后执行的文件。
【解决方案2】:

最简单的答案:

import my_module

print open(my_module.__file__).read()

我也尝试过使用检查包。

import inspect

import my_module

source_list = inspect.getsourcelines(my_module)

会给你一个字符串列表,里面定义了源代码

for line in source_list[0]:
    print line

将以可读的方式打印出整个源代码

【讨论】:

  • 这对脚本不起作用,因为我只是执行它,而不是导入它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 2015-03-05
相关资源
最近更新 更多