想象一下,运行一个python脚本需要很长时间,如果我在运行时修改它会发生什么?结果会不同吗?
当前回答
这与你在问题中描述的略有不同,但它是有效的:
my_string = "Hello World!"
line = input(">>> ")
exec(line)
print(my_string)
测试运行:
>>> print("Hey")
Hey
Hello World!
>>> my_string = "Goodbye, World"
Goodbye, World
您可以动态地更改“加载”代码的行为。
其他回答
这与你在问题中描述的略有不同,但它是有效的:
my_string = "Hello World!"
line = input(">>> ")
exec(line)
print(my_string)
测试运行:
>>> print("Hey")
Hey
Hello World!
>>> my_string = "Goodbye, World"
Goodbye, World
您可以动态地更改“加载”代码的行为。
执行以下脚本:
from time import sleep
print("Printing hello world in: ")
for i in range(10, 0, -1):
print(f"{i}...")
sleep(1)
print("Hello World!")
然后将“Hello World!”更改为“Hello StackOverflow!”当它开始倒数时,它仍然会输出“Hello World”。
不,结果将不反映保存后的更改。当运行常规的python文件时,结果不会改变。您必须保存更改并重新运行程序。
没有,就像这个答案。此外,我还做了涉及到multiprocessing的实验。将下面的脚本保存为x.py:
import multiprocessing
import time
def f(x):
print(x)
time.sleep(10)
if __name__ == '__main__':
with multiprocessing.Pool(2) as pool:
for _ in pool.imap(f, ['hello'] * 5):
pass
在python3 x.py和前两个'hello'被打印出来之后,我将['hello']修改为['world']并观察发生了什么。没有什么有趣的事情发生。结果仍然是:
hello
hello
hello
hello
hello
这是一个有趣的问题。答案是“视情况而定”。
考虑下面的代码:
"Example script showing bad things you can do with python."
import os
print('this is a good script')
with open(__file__, 'w') as fdesc:
fdesc.write('print("this is a bad script")')
import bad
尝试将上面的文件保存为“/tmp/bad.py”,然后执行“cd /tmp”,最后执行“python3 bad.py”,看看会发生什么。
在我的ubuntu 20系统上,我看到输出:
this is a good script
this is a bad script
所以,你问题的答案是“视情况而定”。如果你不做任何奇怪的事情,那么脚本就在内存中,你就没事了。但是python是一种非常动态的语言,所以有多种方法可以修改你的“脚本”并让它影响输出。
如果您不打算做任何奇怪的事情,那么可能需要注意的事情之一是函数中的导入。
下面是另一个例子,它说明了这个想法(保存为“/tmp/modify.py”,然后执行“cd /tmp”,然后执行“python3 modify.py”来运行)。下面定义的fiddle函数模拟在脚本运行时修改脚本(如果需要,可以删除fiddle函数,在倒数第二行插入time.sleep(300),然后自己修改文件)。
关键在于,由于show函数是在函数内部进行导入,而不是在模块顶部进行导入,因此在调用函数之前不会发生导入。如果在调用show之前修改了脚本,那么将使用修改后的脚本版本。
如果您在修改运行脚本时发现了令人惊讶或意想不到的行为,我建议您在函数中寻找import语句。有时这样做是有很好的理由的,所以你会不时地在人们的代码和一些库中看到它。
下面演示了函数内部的导入如何导致奇怪的效果。您可以尝试这样做,而不是注释掉对小提琴函数的调用,以查看在脚本运行时修改脚本的效果。
"Example showing import in a function"
import time
def yell(msg):
"Yell a msg"
return f'#{msg}#'
def show(msg):
"Print a message nicely"
import modify
print(modify.yell(msg))
def fiddle():
orig = open(__file__).read()
with open(__file__, 'w') as fdesc:
modified = orig.replace('{' + 'msg' + '}', '{msg.upper()}')
fdesc.write(modified)
fiddle()
show('What do you think?')
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录