想象一下,运行一个python脚本需要很长时间,如果我在运行时修改它会发生什么?结果会不同吗?
当前回答
不,结果将不反映保存后的更改。当运行常规的python文件时,结果不会改变。您必须保存更改并重新运行程序。
其他回答
没有,因为Python将脚本预编译为PYC文件并启动该文件。
但是,如果发生了某种异常,您可能会得到一个略微具有误导性的解释,因为行X的代码可能与启动脚本之前的代码不同。
什么都没有发生。一旦脚本加载到内存中并运行,它将保持如下所示。
“自动重新加载”特性可以在代码中实现,就像Flask和其他框架一样。
不同。如果一个python脚本链接到其他修改过的文件,那么当然会加载更新的版本。但是如果源不指向任何其他文件,它就会运行缓存中的所有脚本,只要它运行。下次就能看到变化了…
如果关于自动应用更改,是的,@pcbacterio是正确的。它可以做thar,但脚本,它只记得最后的动作/事情是做什么,并检查当文件被修改重新运行它(所以它几乎不可见)
=]
当你运行一个python程序并启动解释器时,发生的第一件事是:
初始化模块sys和builtins __main__模块被初始化,这是你作为参数提供给解释器的文件;这将导致代码执行
When a module is initialized, it's code is run, defining classes, variables, and functions in the process. The first step of your module (i.e. main file) will probably be to import other modules, which will again be initialized in just the same way; their resulting namespaces are then made available for your module to use. The result of an importing process is in part a module (python-) object in memory. This object does have fields that point to the .py and .pyc content, but these are not evaluated anymore: module objects are cached and their source never run twice. Hence, modifying the module afterwards on disk has no effect on the execution. It can have an effect when the source is read for introspective purposes, such as when exceptions are thrown, or via the module inspect.
这就是为什么在添加不打算在导入模块时运行的代码时,检查__name__ == "__main__"是必要的。以main方式运行该文件等同于导入该文件,除了__name__有不同的值。
来源:
导入模块时会发生什么:导入系统 解释器启动时会发生什么:顶级组件 什么是__main__模块:__main__顶级代码环境
这是一个有趣的问题。答案是“视情况而定”。
考虑下面的代码:
"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中获得所有直接子目录