想象一下,运行一个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?')