问题 如何在 Bash 脚本中等待该脚本启动的多个子进程完成,并且当这其中任意一个子进程以非零退出码结束时,让该脚本也返回一个非零的退出码? 简单的脚本: #!.../bin/bash for i in `seq 0 9`; do calculations $i & done wait 上述脚本将会等待所有 10 个被创建的子进程结束,但它总会给出退出状态 0...我应该如何修改这个脚本,使其能检测到被创建子进程的退出状态,并且当任何子进程以非零代码结束时,让脚本返回退出码 1?...# 创建一个你想作为子进程运行的命令数组 procs=() # bash数组 procs+=("my_sleep 2") procs+=("my_sleep 1") procs+=("my_sleep...[ $rc -ne 0 ] && break # 若子进程以非零退出码结束,则跳出循环 done #echo $rc exit $rc 将代码保存为文件 wait_procs_demo.sh,再运行测试
的subprocess模块执行外部命令时,有时候会遇到CalledProcessError的异常,这个异常表示执行的命令返回一个非零的退出状态码。...: Command '[‘dot‘, ‘-Tpdf‘, ‘-O‘, ‘Digraph.gv‘]' returned non-zero exit status 1.这个异常表示命令的退出状态码(returncode...)为非零。...在我们的例子中,该状态码为1。解决方法要解决这个问题,我们需要考虑以下几个方面:1. 检查命令是否正确首先,我们需要确保我们执行的命令是正确的。...如果在执行命令时返回了非零的退出状态码,也会抛出异常。这里采用了try-except结构来捕获并处理异常,以便能够在发生错误时进行适当的错误处理。
要解决问题: 首先想到的是获取ant命令的返回值,根据返回值来决定命令行的退出状态(0或非0,0代表正常退出) 查阅相关资料,得知python调用系统命令的函数有:os.system、os.popen...commands.getstatusoutput()返回系统命令的退出状态和输出 commands.getstatus()返回系统命令的退出状态 commands.getoutput()返回系统命令的输出...在使用commands的相关函数执行Ant命令行时: 没有执行构建直接退出(退出状态为: 1,输出为: 不是内部或外部命令,也不是可运行的程序或批处理文件) 结论:可能是因为Ant..., **kwargs )执行上面的call命令,并检查返回值,如果子进程返回非0,则会抛出CalledProcessError异常,这个异常会有个returncode 属性,记录子进程的返回值。.../BUILD FAILED),命令行总是正常退出(返回值为 0) 结论:命令行退出状态(即返回值)与Ant构建状态无关,只是表示Ant构建是否正常执行完毕的状态 既然命令行退出状态(即返回值
背景 python执行操作系统的命令,如python执行shell命令 subprocess模块主要用于创建子进程,并连接它们的输入、输出和错误管道,获取它们的返回状态。...run方法,执行args参数所表示的命令,等待命令结束,并返回一个CompletedProcess类型对象 args:表示要执行的命令。必须是一个字符串,字符串参数列表。...check:如果该参数设置为True,并且进程退出状态码不是0,则弹出CalledProcessError异常。...,返回命令的结果和执行状态,0或者非0 >>> res = subprocess.call(["ls","-l"]) 总用量 28 -rw-r--r-- 1 root root 0 6月 16 10...# 命令执行状态 >>> res 0 参考文档 http://www.liujiangblog.com/course/python/55 http://www.manongjc.com/article
错误分析"Command ‘[‘ninja‘, ‘-v‘]‘ returned non-zero exit status 1"这个错误信息是在执行Ninja构建命令时出现的。...其中:"ninja"是执行构建的命令。"-v"是一个可选的参数,用于启用详细的构建输出。"non-zero exit status 1"表示构建命令以非零状态退出。...在Unix和类Unix系统中,非零的退出状态通常表示执行过程中出现了错误。可能原因和解决方案要解决这个错误,我们需要确定出现错误的原因,并采取相应的解决方案。...except CalledProcessError as e: print("项目构建失败!...如果构建命令成功执行,check_output函数将返回命令执行的输出结果。否则,它将引发CalledProcessError异常,并打印出错误信息。
正文 1. 错误原因分析 在解决任何问题之前,我们首先需要了解问题的根源。 1.1 什么是 subprocess-exited-with-error?...这通常意味着在执行外部命令时,子进程返回了一个非零的退出状态,表示执行失败。 1.2 常见原因 外部命令或脚本本身存在错误。 外部命令所依赖的环境或资源不可用。 调用命令的方式或参数有误。 2....import subprocess result = subprocess.run(['my_command', 'arg1', 'arg2'], capture_output=True, text=...3.1 简单示例 import subprocess try: subprocess.check_call(['ls', '-l']) except subprocess.CalledProcessError...command, capture_output=True, text=True, check=True) return result.stdout except subprocess.CalledProcessError
如果close_fds 为True,所有的文件描述符除了0、1和2都会在子进程执行之前关闭。 如果shell是True,将通过shell执行指定的命令。...等待命令完成后返回返回码属性。 这些参数相对于Popen构造函数是相同的。 ...等待命令完成.如果退出码是0则返回,如果是其他则抛出 CalledProcessError错误,该CalledProcessError 对象就会有返回返回码属性 这些参数相对于...如果退出码是非0则会抛出CalledProcessError。 ...执行一个不存在的文件,应用程序会抛出OSError异常 如果Popen被无效的参数调用就会抛出‘ValueError’ 如果check_call() and check_output()在被调用过程中返回一个非零的返回码则会抛出
CMD的状态码(0 - 成功,其他 - 失败或被中断) 无管道 os.popen([CMD], [mode = 'r' | 'w' ], buffersize) 开启子shell执行CMD,返回执行命令的输入流...返回值:0 或 非0值 阻塞父进程,直到该函数结束 结束条件:命令执行完成或超时 用于代替 os.system() 不支持管道 check_call(*popenargs, **kwargs)...功能:检查在子进程中运行命令的执行情况 返回值:0。...(命令退出码为0时,返回0;否则,无返回值,直接引发CalledProcessError异常) 阻塞父进程,直到该函数结束 结束条件: 命令执行完成 或 超时 不支持管道 check_output(*popenargs...(如果命令返回码为0,返回运行结果;否则,直接抛出CalledProcessError异常) 不阻塞父进程 不支持stdout的管道 指定参数:stderr = STDOUT 可捕获错误信息 支持参数:
,等待命令完成后返回returncode属性。...如果返回代码为0,则返回,否则抛出 CalledProcessError。...,并返回输出 如果返回代码为b不为0,则抛出 CalledProcessError。...,返回非0值时抛出。...returncode 子进程的退出状态 cmd 用于衍生子进程的命令。 output 如果异常由check_output抛出,则存放子进程的输出。
使用方法: 运行外部命令:subprocess.call(command) subprocess的call方法可以用于执行一个外部命令,但该方法不能返回执行的结果,只能返回执行的状态码: 成功(0) 或...错误(非0) 方法一: subprocess.call(['ls','-l']) 总用量 4 -rw-r--r-- 1 liangml liangml 0 3月 7 15:38 mark.md...print(a) 0 错误处理:subprocess.check_call() 我们说过call执行返回一个状态码,我们可以通过check_call()函数来检测命令的执行结果,如果不成功将返回 subprocess.CalledProcessError...与进程的单向通信:通过Popen()方法调用命令后执行的结果,可以设置stdout值为PIPE,再调用communicate()获取结果,返回结果为tuple....,0表示子进程结束,None未结束 在使用Popen调用系统命令式,建议使用communicate与stdin进行交互并获取输出(stdout),这样能保证子进程正常退出而避免出现僵尸进程: 示例: proc
os.popen(command).read() 可以获取命令执行结果,但是无法获取命令执行状态码 commands.getstatusoutput(command) 返回一个元组(命令执行状态码, 命令执行结果...执行指定的命令,如果执行状态码为0则返回命令执行结果,否则抛出异常。 ...check: 如果check参数的值是True,且执行命令的进程以非0状态码退出,则会抛出一个CalledProcessError的异常,且该异常对象会包含 参数、退出状态码、以及stdout和stderr...subprocess.call(command) 方法 subprocess的call方法可以用于执行一个外部命令,但该方法不能返回执行的结果,只能返回执行的状态码: 成功(0) 或 错误(非...0时,直接抛出异常 subprocess.check_call() 方法 我们说过call执行返回一个状态码,我们可以通过check_call()函数来检测命令的执行结果,如果不成功将返回 subprocess.CalledProcessError
Main API ======== run(...): 运行命令,等待它完成,然后返回`CompletedProcess`实例。...check_call(...): Same as call() but raises CalledProcessError() if return code is not 0(返回值不是0就引发异常...of stdout instead of a return code getoutput(...): 在shell中运行命令,等待它完成,然后返回输出 Runs a command in the shell..., waits for it to complete,then returns the output getstatusoutput(...): 在shell中运行命令,等待它完成,然后返回一个(exitcode...__name__, ', '.join(args)) def check_returncode(self): """如果退出代码非零,则引发CalledProcessError
处理错误 如果子进程返回非零的退出码,subprocess.run()将引发CalledProcessError异常。...(['ls', '-l']) print(return_code) 在这个例子中,subprocess.call()执行了ls -l命令,返回了命令的退出码。...如果子进程的返回码不为零,它将引发subprocess.CalledProcessError异常。...,如果返回码不为零,则引发异常。...使用subprocess模块的call函数运行命令 subprocess模块的call函数用于运行命令,它返回命令的退出状态码。
执行指定的命令,如果执行成功则返回状态码,否则抛出异常。其功能等价于subprocess.run(…, check=True)。...执行指定的命令,如果执行状态码为0则返回命令执行结果,否则抛出异常。...subprocess.getstatusoutput(cmd)执行cmd命令,返回一个元组(命令执行状态, 命令执行结果输出),其功能类似于commands.getstatusoutput()。...check: 如果check参数的值是True,且执行命令的进程以非0状态码退出,则会抛出一个CalledProcessError的异常,且该异常对象会包含 参数、退出状态码、以及stdout和stderr...2.subprocess.Popen类的实例可调用的方法方法 描述Popen.poll() 用于检查子进程(命令)是否已经执行结束,没结束返回None,结束后返回状态码。
如果args为字符串,该字符串表示要通过shell执行的命令;如果args为序列,第一个元素指定要执行的程序,其他元素视为参数。...CompletedProcess run()函数运行的返回值,表示进程执行完成。 属性 args:传入run()函数的第一个参数,list或string类型 returncode:子进程退出码。...如果未捕获标准错误返回None 方法 check_returncode():如果returncode非0,抛出CalledProcessError异常 异常 subprocess.SubprocessError...check_call()或check_output()函数返回非0状态码时抛出。...属性 returncode:子进程退出码。
check:如果设置为True,进程执行返回非0状态码将抛出CalledProcessError异常。...subprocess.call() 运行并等待args参数指定的指令完成,返回执行状态码(Popen实例的returncode属性)。...0状态码或抛出CalledProcessError异常,该异常的cmd和returncode属性可以查看执行异常的指令和状态码。...如果执行状态码非0,将抛出CalledProcessError异常。 参数:(*popenargs, timeout=None, **kwargs)。...as ex: data = ex.output exitcode = ex.returncode if data[-1:] == '\n': data = data[:-1]
[file ...] >>> print out 1 2.2 subprocess.check_call() 父进程等待子进程完成,正常情况下返回0,当检查退出信息,如果returncode不为0...,则触发异常subprocess.CalledProcessError,该对象包含有returncode属性,应用程序中可用try...except...来检查命令是否执行成功。...CalledProcessError异常,并且返回结果1 ls: illegal option -- I usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1...2.3 subprocess.check_output() 和 subprocess.check_call() 类似,但是其返回的结果是执行命令的输出,而非返回0/1 其实现方式 def check_output...Popen.returncode 获取进程的返回值,成功时,返回0/失败时,返回 1。如果进程还没有结束,返回None。
执行命令但无法获取取命令输出时,可以使用 os.system os.system() 是C语言 system() 函数的封装,返回命令的退出状态码,命令执行结果输出到标准输出(stdout/窗口...其返回值是指令运行后返回的状态码,0表示指令成功执行,1表示失败,256表示没有返回结果,该方法适用于系统命令不需要输出内容的场景。...用法: os.popen(command[, mode[, bufsize]]) os.system(cmd) 或 os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容...run默认不会返回输出,只返回命令和执行状态。...subprocess.CalledProcessError异常包括returncode、cmd、output等属性,其中returncode是子进程的退出码,cmd是子进程的执行命令,output为None
使用subprocess包中的函数创建子进程的时候,要注意: 1) 在创建子进程之后,父进程是否暂停,并等待子进程运行。 2) 函数返回什么 3) 当returncode不为0时,父进程如何处理。...subprocess.call() 父进程等待子进程完成 返回退出信息(returncode,相当于exit code,见Linux进程基础) subprocess.check_call() 父进程等待子进程完成...返回0 检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性,可用try...except...来检查...subprocess.check_output() 父进程等待子进程完成 返回子进程向标准输出的输出结果 检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError...shell命令中有一些是shell的内建命令,这些命令必须通过shell运行,$cd。shell=True允许我们运行这样一些命令。
该模块拥有多个方法,具体如下: subprocess.call() 直接打印系统命令的执行结果,如果执行成功,返回状态码为0,否则为1,例如: #执行成功 import subprocess CALL1...直接打印系统命令的执行结果,使用方法与subprocess.call()相同,只不过该函数会检测返回状态码,如果为1,则会抛出subprocess.CalledProcessError错误,例如: import...(retcode, cmd) subprocess.CalledProcessError: Command 'ping 1.1.1.2 -n 1' returned non-zero exit status...subprocess.check_output() 不会将系统命令的执行结果直接打印出来,返回一个bytes类型的对象,该对象包含了系统命令的执行结果,如果执行失败会抛出subprocess.CalledProcessError... at 0x02230810> 0.06108553745727746 #从时间上看,主程序很快就结束了 Popen()创建的对象方法包括: POPEN1.poll() # 检查子进程状态 POPEN1
领取专属 10元无门槛券
手把手带您无忧上云