plumbum.commands.processes.ProcessExecutionError: для команд, которые возвращают ноль - PullRequest
0 голосов
/ 01 сентября 2018

Команда оболочки, которую я хочу запустить, которая ничего не возвращает:

echo helloWorld | grep 'dummy'

версия Plumbum:

работает следующая строка:

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] Как я могу исправить эту ошибку?

1 Ответ

0 голосов
/ 23 июля 2019

Это происходит потому, что состояние выхода grep равно 1, если он ничего не находит, как описано в его руководстве

Вы можете попробовать это в командной строке, если хотите:

echo helloWorld | grep h; echo $?
echo helloWorld | grep x; echo $?

приведет к

helloWorld
0
1

Способы обойти это описаны в другом хорошем ответе , например.

echo helloWorld | grep x | cat

даст 0 как статус. Но, к сожалению, plumbum выполняет локальный механизм конвейера, поэтому вывод grep передается в plumbum, а затем plumbum передает его следующей команде - это означает, что кошка не может проглотить код выхода 1, перед ним будет выдано исключение.

Итак, две мои идеи - создать сценарий оболочки для запуска grep, который никогда не выдаст ошибку при поиске без результатов:

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

и выполните это вместо grep (называемого c1grep в исходном ответе) или добавьте блок try / исключением вокруг кода канала и вручную обработайте код выхода 1 (ProcessExecutionError).

...