【问题标题】:Waiting for external launched process product finish to continue等待外部启动过程产品完成继续
【发布时间】: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


【解决方案1】:

要解决此问题,请尝试添加更多调试输出:

import subprocess 
from subprocess import PIPE


def function(directory, exe, a, b):    
    cmd = directory + exe + a + b
    print("Running", cmd)

    result = subprocess.run(cmd, stdout=PIPE, stderr=PIPE)

    print("Return code:", result.returncode)
    print("STDOUT:", result.stdout)
    print("STDERR:", result.stderr)
 

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)

【讨论】:

    猜你喜欢
    • 2012-02-15
    • 2013-04-25
    • 2019-11-01
    • 2015-10-03
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多