修改 python 文件,就好像它是文本文件一样,但仍然有变量等

Modify python file as if it were a text file, but still having variables and such

我正在测试一些 python 东西,我开始想知道是否可以像修改文本文件一样修改 python 文件。

我查看了 open(<filename>, "r+"),但这只是编辑文件。我不能像 python 脚本一样修改它,修改实际的脚本而不仅仅是缓存。


#main.py

import filea

filea.var1edit("Hello world")

预计之前:

#filea.py

var1 = "Text"
def var1edit(var):
  global var1
  var1 = var

预计:

#filea.py

var1 = "Hello world"
def var1edit(var):
  global var1
  var1 = var

实际之后:

#filea.py

var1 = "Text"
def var1edit(var):
  global var1
  var1 = var

模块 astastunparse 可能会有用。 我们首先读取 .py 文件,生成 AST,修改 AST,解析它并写回新代码。这是一个例子:

#main.py
import ast
import astunparse

class ReWriteSource(ast.NodeTransformer):
    #visit 'Assign' node and modify
    def visit_Assign(self,node):
        if node.targets[0].id == 'var1' and isinstance(node.value,ast.Str):
            node.value.s = 'Hello World!'
        return node

#read .py file
with open('filea.py','r') as f:
    source = f.read()
#generate the AST
source_ast = ast.parse(source)
#modify the AST
ReWriteSource().visit(source_ast)
#unparse and write it back
with open('filea.py','w') as f:
    f.write(astunparse.unparse(source_ast))

原版filea.py:

#filea.py
var1 = 'Text'
def var1edit(var):
    global var1
    var1 = var

修改后filea.py:

#filea.py
var1 = 'Hello World!'
def var1edit(var):
    global var1
    var1 = var