修改 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
模块 ast
和 astunparse
可能会有用。
我们首先读取 .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
我正在测试一些 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
模块 ast
和 astunparse
可能会有用。
我们首先读取 .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