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())

关键点:

  1. sys.executable 确保使用当前Python解释器。
  2. stdout=asyncio.subprocess.PIPE 让你能捕获输出。
  3. 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 函数吗?

回到顶部