gpt4 book ai didi

python - plumbum.commands.processes.ProcessExecutionError : for commands which return null

转载 作者:行者123 更新时间:2023-12-01 09:05:05 25 4
gpt4 key购买 nike

我想要运行的 shell 命令,它不返回任何内容:

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

[问]如何修复此错误?

最佳答案

发生这种情况是因为,如果 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 将其传递到下一个命令 - 这意味着 cat 无法吞下退出代码 1,在它之前会抛出异常。

所以我的两个想法是创建一个 shell 脚本来运行 grep 在没有结果的搜索中永远不会返回错误:

#!/bin/bash
grep "$@" || test $? = 1

并执行此命令而不是 grep (在原始答案中称为 c1grep),或者在管道代码周围添加 try/except block 并手动处理退出代码 1 (ProcessExecutionError)。

关于python - plumbum.commands.processes.ProcessExecutionError : for commands which return null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52128914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com