如何在Python中获取当前脚本的代码?

10
我想在 Python 中将当前脚本作为字符串存储在变量中。我找到了两种次优解决方案,但希望有更好的解决方案:
1. 使用 `inspect` 模块的 `getsource` 方法,但它只返回一个函数(或类或其他内容)的代码,而不是整个脚本。我找不到一种方法将整个脚本对象传递给 `getsource`。
2. 我可以使用 `__file__` 或 `sys.argv[0]` 找到脚本文件的位置并打开它来读取,但这似乎对我来说太间接了。
因此,是否存在访问整个脚本字符串的(更好的)方法?
如果相关的话:我更喜欢 Python 2.7 的解决方案而不是 3.x。

1
你实际上想要通过这个做什么呢? - jonrsharpe
似乎不太一样,提供的答案并没有真正展示如何访问脚本自身的代码,而是其他脚本的代码。 - Will
@jonrsharpe 这是为了一个代码高尔夫谜题。 - agtoever
@jonrsharpe 请看这里 - agtoever
1
@jonrsharpe:我有同样的问题。在我的情况下,我有一个数据处理脚本,将结果转储到文件中,并且我想记录它是如何与结果一起完成的。 - user66081
显示剩余2条评论
1个回答

18

尝试:

import inspect
import sys

print inspect.getsource(sys.modules[__name__])

甚至可以是:

import inspect
import sys

lines = inspect.getsourcelines(sys.modules[__name__])[0]

for index, line in enumerate(lines):
    print "{:4d} {}".format(index + 1, line)

代码所在的文件被视为Python“模块”,sys.modules[__name__]返回对该模块的引用。

编辑

或者,如@ilent2建议的那样,可以不使用sys模块:

import inspect

print inspect.getsource(inspect.getmodule(inspect.currentframe()))

1
或者,使用更少的导入,但可能不太易读:inspect.getsource(inspect.getmodule(inspect.currentframe())) - ilent2
注意:有一个错误的情况,就是在zip文件中加载的主文件linecache无法使用自定义加载器获取__main__模块的源代码·问题#86291·python/cpython - user202729

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接