【发布时间】:2021-11-26 10:42:32
【问题描述】:
我有一个 Python 代码,其中定义了一些调用外部进程的函数。每个函数启动的每个进程都会生成运行下一个函数所需的最终产品。问题是脚本没有等待外部后台进程完成(我正在处理一些重图像,因此该过程需要一段时间)。
我尝试使用os.system()、subprocess.call() 和subprocess.run() 启动外部进程,但它们都不起作用。我也尝试过使用time.sleep() 和Event().wait(),但它们也无法工作,因为它们也会停止外部后台进程。
部分代码:当cmd字符串被调用时,一个外部进程被启动到一个图像处理程序。
即使第一次调用的乘积没有完成,第二次调用function也会报错。
问题可能是函数中没有返回特定的产品,因此 Python 无法识别产品何时完成。
import subprocess
def function(directory, exe, a, b):
cmd = directory + exe + a + b
subprocess.run(cmd)
function(directory1, exe1, a1, b1)
function(directory2, exe2, a2, b2) #directory2 is where the product obtained from function1 is saved.
function(directory3, exe3, a3, b3) #directory3 is where the product obtained from funciton2 is saved.
有没有什么方法可以在获得产品之前停止执行以下命令,而不是停止后台进程?
有什么帮助吗?感谢您的建议!
【问题讨论】:
-
您的进程似乎立即进入后台。你可以向它发送一些论据来防止这种情况发生吗?
subprocess.run真的应该阻塞直到进程完成,所以这里有些可疑:docs.python.org/3/library/subprocess.html#subprocess.run 什么是可执行参数?它甚至会运行吗?你可以用print(subprocess.run(cmd))测试一下吗? -
你也可以把
print(cmd)放在subprocess.run之前吗? -
可执行参数看起来像这样:'C:\\LAStools\\bin\\las2las -i C:\\directory\*.laz -drop_intensity_below 1000 -keep_class 2 3 4 5 -odir C:\\目录\\-olaz'。它调用 LAStools 软件并执行参数。我测试它是否正在运行(print(subprocess.run(cmd))。实际上,进程开始运行但在出现function2错误时停止。
-
print(subprocess.run(cmd)究竟返回了什么? -
CompletedProcess(args='...', returncode=0)。我不能把所有的 args 因为它对于 cmets 中允许的字符来说太长了,但它与引入的 cmd 一致。
标签: python subprocess system-calls wait