Jui*_*icy 42 python subprocess
我在用:
grepOut = subprocess.check_output("grep " + search + " tmp", shell=True)
Run Code Online (Sandbox Code Playgroud)
要运行终端命令,我知道我可以使用try/except来捕获错误但是如何获取错误代码的值?
我在官方文档中找到了这个:
exception subprocess.CalledProcessError
Exception raised when a process run by check_call() or check_output() returns a non-zero exit status.
returncode
Exit status of the child process.
Run Code Online (Sandbox Code Playgroud)
但是没有给出任何例子,谷歌没有任何帮助.
Dan*_*Gar 58
您可以从引发的异常中获取错误代码和结果.
这可以通过域来完成returncode
和output
.
例如:
import subprocess
try:
grepOut = subprocess.check_output("grep " + "test" + " tmp", shell=True)
except subprocess.CalledProcessError as grepexc:
print "error code", grepexc.returncode, grepexc.output
Run Code Online (Sandbox Code Playgroud)
jfs*_*jfs 32
有没有办法在没有try/except的情况下获得返回代码?
check_output
如果它收到非零退出状态,则会引发异常,因为它经常意味着命令失败.grep
即使没有错误,也可能返回非零退出状态 - .communicate()
在这种情况下你可以使用:
from subprocess import Popen, PIPE
pattern, filename = 'test', 'tmp'
p = Popen(['grep', pattern, filename], stdin=PIPE, stdout=PIPE, stderr=PIPE,
bufsize=-1)
output, error = p.communicate()
if p.returncode == 0:
print('%r is found in %s: %r' % (pattern, filename, output))
elif p.returncode == 1:
print('%r is NOT found in %s: %r' % (pattern, filename, output))
else:
assert p.returncode > 1
print('error occurred: %r' % (error,))
Run Code Online (Sandbox Code Playgroud)
您不需要调用外部命令来过滤行,您可以在纯Python中执行:
with open('tmp') as file:
for line in file:
if 'test' in line:
print line,
Run Code Online (Sandbox Code Playgroud)
如果你不需要输出; 你可以使用subprocess.call()
:
import os
from subprocess import call
try:
from subprocess import DEVNULL # Python 3
except ImportError: # Python 2
DEVNULL = open(os.devnull, 'r+b', 0)
returncode = call(['grep', 'test', 'tmp'],
stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL)
Run Code Online (Sandbox Code Playgroud)
mko*_*bit 11
Python 3.5引入了该subprocess.run()
方法.签名如下:
subprocess.run(
args,
*,
stdin=None,
input=None,
stdout=None,
stderr=None,
shell=False,
timeout=None,
check=False
)
Run Code Online (Sandbox Code Playgroud)
返回的结果是a subprocess.CompletedProcess
.在3.5中,你可以访问args
,returncode
,stdout
,并stderr
从执行过程.
例:
>>> result = subprocess.run(['ls', '/tmp'], stdout=subprocess.DEVNULL)
>>> result.returncode
0
>>> result = subprocess.run(['ls', '/nonexistent'], stderr=subprocess.DEVNULL)
>>> result.returncode
2
Run Code Online (Sandbox Code Playgroud)