最近想设计一个普适性高的函数绘图,可以用户手动输入函数方程,但是输入的方程为字符串形式,所以我就考虑用f.writelines的方式实时更新一个.py文件,并在生成后调用其中的方法来生成图像,具体如下:
import os
import func1
new_lines = "import numpy as np\n" \
"import matplotlib as plt\n\n\n" \
"def draw_line():\n" \
" x = np.linspace(0, 100, 100)\n" \
" y = x\n" \
" plt.plot(x, y)\n" \
" plt.show()\n"
with open(os.path.join(os.getcwd(), "func1.py"), "w+") as f:
f.writelines(new_lines)
try:
func1.draw_line()
except Exception:
print("something is wrong here.....")
事实上,可以成功生成func1.py文件,并且也可以成功调用draw_line()方法,但是如果我不停止运行程序,连续修改func1.py中的文字,哪怕将func1.py中的内容清空,也只能显示第一次的方程绘图,但是f.readlines()能够成功读取真实的内容,请问这是为什么呢?
func1.py在import的时候就固定了,你可以了解下python的exec()这个函数,并不需要将代码写入一个新文件中。
我想了一下,好像有点儿明白了
比如在程序运行前我的方程是“y=x”,编译的时候就固定了,而当我修改func1中的内容时,编译已经结束了
修改过的内容只有再次编译才能生效,但是文件的更新是实时的
进行了修改,不使用定义方法然后调用的形式
而是直接写函数体
然后在修改func1.py后使用os.system(python func1.py),即可每次运行都单独编译该文件,实现每次都更新的功能