在Python脚本的for循环中重复执行另一个Python脚本的问题
解决Python循环中重复执行外部脚本的问题
Python里的import语句有个特性:模块一旦被导入,就会被缓存起来,后续再import只会直接读取缓存的模块对象,不会重复执行模块里的顶层代码,所以你原来的循环里用import只会在第一次迭代时跑脚本。
下面给你几种可行的解决办法:
方法1:用subprocess直接调用Python执行脚本
这是最稳妥的方式,相当于每次在命令行手动跑一遍run_this_script.py,完全独立于当前脚本的进程,不会受模块缓存影响。
代码示例:
import subprocess import sys for i in range(1, 10): # 用当前环境的Python解释器执行目标脚本 subprocess.run([sys.executable, "run_this_script.py"], check=True)
sys.executable能自动获取当前Python环境的解释器路径,避免不同环境的版本冲突- 加
check=True的话,要是脚本执行出错(比如返回非0状态码),会直接抛出异常,方便你排查问题
方法2:用importlib重新加载模块(不推荐,仅限特殊场景)
如果不想新开进程,可以用importlib.reload()强制重新加载模块,让它再次执行顶层代码,但有几个坑要注意:
- 模块里的全局变量会被重置,可能导致逻辑异常
- 脚本里的
if __name__ == "__main__":代码块不会被执行,因为reload时模块名不是__main__
代码示例:
import importlib # 先导入一次模块 import run_this_script for i in range(1, 10): importlib.reload(run_this_script)
方法3:把脚本逻辑封装成函数调用(最规范)
如果能修改run_this_script.py,建议把里面的核心逻辑封装成函数,然后在主脚本里导入这个函数循环调用,这是Python项目里最推荐的写法。
先修改run_this_script.py:
def main(): # 把原来脚本里的所有逻辑都放到这个函数里 print("执行脚本逻辑") # 示例逻辑 # 保留原来的执行入口,方便单独运行脚本 if __name__ == "__main__": main()
然后主脚本里这么写:
from run_this_script import main for i in range(1, 10): main()
内容的提问来源于stack exchange,提问作者Retsied
相关产品推荐
相关产品推荐

