繁体   English   中英

如何从 Python 异步调用 shell 脚本?

[英]How to asynchronously call a shell script from Python?

我有一个 shell 脚本,它对传递的字符串进行一些处理,然后将其写入文件。 但是我不希望我的函数 foo() 等待它完成操作。 如何调用process(msg)然后继续执行{code block 2}而无需等待process(msg)完成执行?

def process(msg):
    subprocess.call(['sh', './process.sh', msg])

def foo():
    # {code block 1}
    process(msg)
    # {code block 2}

foo()将被另一个函数调用,几乎每秒一次或两次。

你需要的是https://docs.python.org/3/library/os.html#os.fork ie os.fork()这样你就可以产生一个子进程,它可以比父进程os.fork()更长,以后可以通过Linux 上的systemd 我对 Windows 一无所知。

只是为了完整性:Python 的 asyncio 提供了一个高级接口来做到这一点: https ://docs.python.org/3.9/library/asyncio-subprocess.html#subprocesses

文档中的示例:

import asyncio

async def run(cmd):
    proc = await asyncio.create_subprocess_shell(
        cmd,
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE)

    stdout, stderr = await proc.communicate()

    print(f'[{cmd!r} exited with {proc.returncode}]')
    if stdout:
        print(f'[stdout]\n{stdout.decode()}')
    if stderr:
        print(f'[stderr]\n{stderr.decode()}')

asyncio.run(run('ls /zzz'))

subprocess.call() 和 subprocess.run() 创建一个进程,等待它完成,并返回一个 CompletedProcess 对象。

subprocess.Popen() 创建一个进程并返回它。 它是在前面的函数的引擎盖下使用的。 然后,您可以等待该过程完成,向其发送消息,或者您想做的任何其他事情。 参数大部分与callrun相同。

https://docs.python.org/3/library/subprocess.html

稍微细化一下,Popen 是使用 os 启动新进程的 python 实现。 os.fork() 是一个较低的级别,它实际上并没有做我们在这里想要的,它会产生另一个 python 解释器的实例,它的内存状态与当前的相同。 如果你想使用较低级别的系统调用, os.spawn接近subprocess.runos.fork

为了验证 Popen 正在做你想要的,这个测试程序会打印“returncode = None”,然后等待 5 秒,并打印“returncode = 0”

from subprocess import Popen

p = Popen(["sleep", "5"])
print("started the proc")  # this will print immediately
p.poll()  # this checks if the process is done but does not block
print(f"p returncode = {p.returncode}")
p.wait()  # this blocks until the process exits
print(f"p returncode = {p.returncode}")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM