我有一个执行计算的程序,从 Linux 终端上的命令行运行。 它使用类似的命令
program_name -i input_file -o output_file1 -r output_file2 -w dependency1 -d dependency2
我有一个 Python 包装脚本,我用它来进行一些文件处理并执行上述命令。 该脚本也从 Linux 终端运行执行。 由于计算程序可能需要很长时间才能运行(从几分钟到几小时),我希望能够将终端输出(每 10 秒写入输出的 CPU 和程序时间)写入文件并将进程发送到后台,以便我可以继续其他终端操作。 我实际上尝试作为子进程执行的命令是
nohup
问题是
program_name -i input_file -o output_file1 -r output_file2 -w dependency1 -d dependency2 </dev/null >output.log 2>&1 &
及其依赖项存储在共享网络位置中,由于参数长度的限制,我无法使用程序/文件的路径运行程序。 我需要创建到程序/文件的符号链接,运行该程序,然后取消链接程序和文件。 如果我在终端前台运行子进程,则效果很好。 然而,当我尝试在后台运行子进程时,Python 不会等待它完成,然后再继续执行下一段代码,这会取消程序和依赖项的链接,从而导致程序失败。
我的代码是这样工作的program_name
如果子进程通过删除末尾
# create symbolic links
for file in [program_name, dependency1, dependency2, dependency3]:
src = path_to_program / file
dst = current_directory / file
try:
os.symlink(src, dst)
except FileExistsError:
pass
# create command
cmd = "program_name -i {inp} -o {out1} -r {out2} -w {dep1} -d {dep2} </dev/null >output.log 2>&1 &".format(
inp=input_file
out1=output_file1
out2=output_file2
dep1=dependency1
dep2=dependency2
)
proc = subprocess.run(cmd, stderr=None, stdout=None, shell=True)
# remove symbolic links
for file in [program_name, dependency1, dependency2, dependency3]:
os.unlink(current_directory / file)
在前台运行,则脚本将等待子进程完成,然后再取消链接文件。 如果在后台运行,一旦子进程启动,脚本就会继续取消链接文件并中断子进程。
我错过了什么? 据我了解&
应该等待子进程完成后再继续,但它似乎没有这样做。 我还尝试将
subprocess.run()
与 subprocess.Popen()
和 .wait()
、.communicate()
、subprocess.call()
和 subprocess.check_call()
一起使用,并获得了与所有这些相同的行为。如果我尝试使用os.system()
喜欢
shell=False
然后
proc = subprocess.run(shlex.split(cmd), stderr=None, stdout=None, shell=False)
尝试读取
program_name
作为参数并返回错误。 会立即退出,Python 不知道 </dev/null >output.log 2>&1 &
何时实际完成。
program_name
,并使用
program_name
的功能来进行 I/O 重定向,而不是 shell 构造。subprocess