如何在linux中将python子进程传输到批处理命令? (子进程运行调用 python 脚本的 bash 命令)

问题描述 投票:0回答:1

我正在尝试通过将 python 脚本通过管道传输到 linux 的

batch
命令来运行它,以基本上形成一个任务队列。这要求我的 python 子进程由 bash 生成,而不是直接在子进程中生成 python 脚本,所以我猜子进程是嵌套的。 python脚本运行并成功,因为它输出一个文本文件,并且该过程给了我一个
returncode
0
,但是如果我在终端中检查
atq
stderr,它不会从队列中清除该进程的 
打印作业编号,表明存在某种错误。我不知道如何从 shell 获取更详细的错误消息,所以如果有人有这方面的信息,我会洗耳恭听。我认为
batch
命令应该在出现错误时发送电子邮件,但我从未收到过。

我如何调用子流程:

process = subprocess.Popen(["/bin/sh", "-c", f"python ./atqTest/hello.py --stuff 1980 | batch"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

out, err = process.communicate()
print(f'out: {out.decode()}')
print(f'err: {err.decode()}')
print(process.returncode)

hello.py
是什么样子:

import sys, argparse

def parse_args(args):
    """Parses command line agruments."""

    parser = argparse.ArgumentParser(
        description="""do stuff""",
        usage="""--stuff <random arg>\n"""
    )

    parser.add_argument(
        "--stuff",
        required=True,
        help="""put something in"""
    )

    return parser.parse_args(args)

def main():
    parser = parse_args(sys.argv[1:])

    with open(f'/Documents/test/test.txt', 'w') as f:
        for item in parser.stuff:
            f.write(item + '\n')

if __name__ == "__main__":
    main()

我得到的输出:

out: 
err: job 94 at Thu Aug 17 10:01:23 2023
0

在终端中输入

atq
后检查子进程状态(可以看到它没有运行):

94      Thu Aug 17 10:01:00 2023

我也尝试过使用它来调用进程,但没有什么区别:

process = subprocess.Popen(f"python ./atqTest/hello.py --stuff 1980 | batch", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
python python-3.x linux bash subprocess
1个回答
0
投票

我正在尝试通过将Python脚本通过管道传输到Linux的批处理命令来运行它,以基本上形成一个任务队列。

batch
命令期望从其标准输入读取一个或多个 shell 命令的文本。它在选择的时间执行这些命令。您可以直接运行命令,并将其 output 提供给
batch

虽然您可以使用 shell 管道向

batch
提供输入,但我认为没有任何理由在这里使用 shell 管道,也根本不涉及
bash
。只需运行
batch
,然后向其输入
communicate()
所需的命令:

process = subprocess.Popen(["batch"], stdin=subprocess.PIPE,
                           stdout=subprocess.PIPE, stderr=subprocess.PIPE)

out, err = process.communicate('python ./atqTest/hello.py --stuff 1980')
print(f'out: {out.decode()}')
print(f'err: {err.decode()}')
print(process.returncode)
© www.soinside.com 2019 - 2024. All rights reserved.