我正在尝试通过将 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脚本通过管道传输到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)