Python中如何异步启动另一个Python脚本?
需求是这样的,我有一个 python 脚本,这个脚本包含一段无限循环执行的代码。现在我使用 django 开发控制脚本执行的功能,即前端发送一个请求给服务器,django 接收到这个请求就停止那个无限循环的脚本,修改那个脚本的配置参数后再重启这段脚本,恢复其运行状态。
现在的问题就是不知道该如何停止脚本以及重启脚本,网上搜了一些解决方案似乎没有奏效。希望有经验的前辈能够指点指点,小弟在此先谢过啦。
Python中如何异步启动另一个Python脚本?
4 回复
启:
ps1=Process(target=my_func)
停:
os.kill(ps1.pid, signal.SIGKILL)
在Python里异步启动另一个脚本,可以用asyncio.create_subprocess_exec。这方法不会阻塞你当前的事件循环,适合在异步程序里调用外部命令。
下面是个简单例子,用asyncio.run()来运行:
import asyncio
import sys
async def run_another_script():
# 启动另一个Python脚本,比如叫 other_script.py
process = await asyncio.create_subprocess_exec(
sys.executable, 'other_script.py',
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE
)
# 等待进程结束并获取输出
stdout, stderr = await process.communicate()
if stdout:
print(f"[stdout]\n{stdout.decode()}")
if stderr:
print(f"[stderr]\n{stderr.decode()}")
print(f"脚本退出码: {process.returncode}")
if __name__ == "__main__":
asyncio.run(run_another_script())
关键点:
sys.executable确保使用当前Python解释器。stdout=asyncio.subprocess.PIPE让你能捕获输出。process.communicate()异步等待进程完成。
如果想完全“启动后不管”,不关心输出和结果,可以简化:
async def fire_and_forget():
await asyncio.create_subprocess_exec(
sys.executable, 'other_script.py'
)
# 不等待,直接继续
注意: 这只是启动了一个独立进程,不是导入模块。如果两个脚本需要频繁通信,考虑用asyncio的队列或管道。
用asyncio的子进程接口就行。
Werkzeug ( Flask )有代码改变时重启自身的功能,你不妨阅读一下源码。
celery 执行的是定时任务,况且 celery 执行后也没法控制啊,只能等着结束。
请问你说的 django 开发控制脚本的意思是写了个脚本执行了 django.setup 函数吗?

