plumbum.commands.processes.ProcessExecutionError: for commands which return null
plumbum.commands.processes.ProcessExecutionError: for commands which return null
shell命令我要运行,其中returns没什么:
echo helloWorld | grep 'dummy'
铅丹版:
以下行有效:
out=(echo["helloWorld"] | grep["h"])().strip()
但是下一行没有,可能是什么原因?
out=(echo["helloWorld"] | grep["dummy"])().strip()
print(out)
我遇到的错误:
Traceback (most recent call last):
File "dd.py", line 6, in <module>
out=(echo["helloWorld"] | grep["dummy"])().strip()
File "/home/user/venv/lib/python3.5/site-packages/plumbum/commands/base.py", line 103, in __call__
return self.run(args, **kwargs)[1]
File "/home/user/venv/lib/python3.5/site-packages/plumbum/commands/base.py", line 240, in run
return p.run()
File "/home/user/venv/lib/python3.5/site-packages/plumbum/commands/base.py", line 201, in runner
return run_proc(p, retcode, timeout)
File "/home/user/venv/lib/python3.5/site-packages/plumbum/commands/processes.py", line 232, in run_proc
return _check_process(proc, retcode, timeout, stdout, stderr)
File "/home/user/venv/lib/python3.5/site-packages/plumbum/commands/processes.py", line 23, in _check_process
proc.verify(retcode, timeout, stdout, stderr)
File "/home/user/venv/lib/python3.5/site-packages/plumbum/commands/base.py", line 412, in verify
dstproc_verify(retcode, timeout, stdout, stderr)
File "/home/user/venv/lib/python3.5/site-packages/plumbum/machines/base.py", line 26, in verify
stderr)
plumbum.commands.processes.ProcessExecutionError: Command line: ['/bin/grep', 'dummy']
Exit code: 1
[Q] 我该如何解决这个错误?
发生这种情况是因为如果没有找到任何东西,grep 的退出状态为 1,如 its manual
中所述
如果您愿意,可以在命令行中尝试:
echo helloWorld | grep h; echo $?
echo helloWorld | grep x; echo $?
将导致
helloWorld
0
1
另一个 nice answer 中描述了规避此问题的方法,例如
echo helloWorld | grep x | cat
将产生 0 作为状态。但不幸的是 plumbum 有一个本地管道机制,所以 grep 输出到 plumbum,然后 plumbum 将它管道到下一个命令 - 这意味着猫不能吞下退出代码 1,它之前会抛出异常。
所以我的两个想法是创建一个 shell 脚本到 运行 一个 grep 从不返回没有结果的搜索错误:
#!/bin/bash
grep "$@" || test $? = 1
并执行它而不是 grep(在原始答案中称为 c1grep),或者在管道代码周围添加一个 try/except 块并手动处理退出代码 1(ProcessExecutionError)。
另一个答案是正确的,但不是最优的 - 这个问题可以在 plumbum 中解决,不需要包装 grep
的外部脚本,也不必捕获异常。
想法是使用 plumbum 的 run
方法来做两件事:
- 强制 plumbum 接受来自被调用程序的任何退出代码(默认情况下,如果返回的错误代码不为零,则会引发异常)。
- 捕获一个包含错误代码、标准输出和被调用程序的标准错误的元组,而不仅仅是 plumbum 通常所做的标准输出。
工作示例:
for s in ["hello","dummy"]:
exitcode,stdout,stderr = (echo["helloWorld"] | grep[s]).run (retcode=None)
if exitcode == 0:
print (stdout.strip())
if exitcode != 0:
print (f"string {s} not present")
print (stderr)
上一个代码returns:
helloWorld
string dummy not present
没有引发任何异常。
shell命令我要运行,其中returns没什么:
echo helloWorld | grep 'dummy'
铅丹版:
以下行有效:
out=(echo["helloWorld"] | grep["h"])().strip()
但是下一行没有,可能是什么原因?
out=(echo["helloWorld"] | grep["dummy"])().strip()
print(out)
我遇到的错误:
Traceback (most recent call last):
File "dd.py", line 6, in <module>
out=(echo["helloWorld"] | grep["dummy"])().strip()
File "/home/user/venv/lib/python3.5/site-packages/plumbum/commands/base.py", line 103, in __call__
return self.run(args, **kwargs)[1]
File "/home/user/venv/lib/python3.5/site-packages/plumbum/commands/base.py", line 240, in run
return p.run()
File "/home/user/venv/lib/python3.5/site-packages/plumbum/commands/base.py", line 201, in runner
return run_proc(p, retcode, timeout)
File "/home/user/venv/lib/python3.5/site-packages/plumbum/commands/processes.py", line 232, in run_proc
return _check_process(proc, retcode, timeout, stdout, stderr)
File "/home/user/venv/lib/python3.5/site-packages/plumbum/commands/processes.py", line 23, in _check_process
proc.verify(retcode, timeout, stdout, stderr)
File "/home/user/venv/lib/python3.5/site-packages/plumbum/commands/base.py", line 412, in verify
dstproc_verify(retcode, timeout, stdout, stderr)
File "/home/user/venv/lib/python3.5/site-packages/plumbum/machines/base.py", line 26, in verify
stderr)
plumbum.commands.processes.ProcessExecutionError: Command line: ['/bin/grep', 'dummy']
Exit code: 1
[Q] 我该如何解决这个错误?
发生这种情况是因为如果没有找到任何东西,grep 的退出状态为 1,如 its manual
中所述如果您愿意,可以在命令行中尝试:
echo helloWorld | grep h; echo $?
echo helloWorld | grep x; echo $?
将导致
helloWorld
0
1
另一个 nice answer 中描述了规避此问题的方法,例如
echo helloWorld | grep x | cat
将产生 0 作为状态。但不幸的是 plumbum 有一个本地管道机制,所以 grep 输出到 plumbum,然后 plumbum 将它管道到下一个命令 - 这意味着猫不能吞下退出代码 1,它之前会抛出异常。
所以我的两个想法是创建一个 shell 脚本到 运行 一个 grep 从不返回没有结果的搜索错误:
#!/bin/bash
grep "$@" || test $? = 1
并执行它而不是 grep(在原始答案中称为 c1grep),或者在管道代码周围添加一个 try/except 块并手动处理退出代码 1(ProcessExecutionError)。
另一个答案是正确的,但不是最优的 - 这个问题可以在 plumbum 中解决,不需要包装 grep
的外部脚本,也不必捕获异常。
想法是使用 plumbum 的 run
方法来做两件事:
- 强制 plumbum 接受来自被调用程序的任何退出代码(默认情况下,如果返回的错误代码不为零,则会引发异常)。
- 捕获一个包含错误代码、标准输出和被调用程序的标准错误的元组,而不仅仅是 plumbum 通常所做的标准输出。
工作示例:
for s in ["hello","dummy"]:
exitcode,stdout,stderr = (echo["helloWorld"] | grep[s]).run (retcode=None)
if exitcode == 0:
print (stdout.strip())
if exitcode != 0:
print (f"string {s} not present")
print (stderr)
上一个代码returns:
helloWorld
string dummy not present
没有引发任何异常。