CalledProcessError: Команда '[' pdftotext ',' -layout ',' coburns.pdf ',' - ']' вернула ненулевой статус выхода 1? - PullRequest
0 голосов
/ 02 мая 2020

Я получаю сообщение об ошибке при запуске этой части моего кода. Я попытался реализовать universal_newlines=True, как предлагается в документации subprocess.check_output, но я получаю ту же ошибку. Почему это происходит и что я могу сделать, чтобы это исправить?

for filename in os.listdir(directory):
    if filename in new_list:
        pdf = filename
        output = subprocess.check_output(['pdftotext', '-layout', pdf, '-'], universal_newlines=True).decode()
        pages = output.strip('\f').split('\f')
        page = pages[-1]

Сообщение об ошибке:

---------------------------------------------------------------------------
CalledProcessError                        Traceback (most recent call last)
<ipython-input-153-adc4a58d7f21> in <module>
      9     if filename in new_list:
     10         pdf = filename
---> 11         output = subprocess.check_output(['pdftotext', '-layout', pdf, '-'], universal_newlines=True).decode()
     12         pages = output.strip('\f').split('\f')
     13         page = pages[-1]

/usr/lib/python3.8/subprocess.py in check_output(timeout, *popenargs, **kwargs)
    409         kwargs['input'] = '' if kwargs.get('universal_newlines', False) else b''
    410 
--> 411     return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
    412                **kwargs).stdout
    413 

/usr/lib/python3.8/subprocess.py in run(input, capture_output, timeout, check, *popenargs, **kwargs)
    510         retcode = process.poll()
    511         if check and retcode:
--> 512             raise CalledProcessError(retcode, process.args,
    513                                      output=stdout, stderr=stderr)
    514     return CompletedProcess(process.args, retcode, stdout, stderr)

CalledProcessError: Command '['pdftotext', '-layout', 'coburns.pdf', '-']' returned non-zero exit status 1.

1 Ответ

0 голосов
/ 03 мая 2020

Как указано в комментариях, check_output фактически означает повышение CalledProcessError, когда код, возвращаемый процессом, не 0.

Здесь этот код 1, что указывает на то, что pdftotext не может открыть pdf, либо потому, что он неправильный, либо потому, что не может его найти.

Вы используете os.listdir, что приводит к именам файлов , относящиеся к аргументу directory, который не обязательно совпадает с текущим рабочим каталогом, в котором check_output запустит pdftotext по умолчанию.

Я вижу три решения:

  • вы можете использовать cwd аргумент check_output для запуска pdftotext в directory,
  • , вы можете восстановить относительный путь к файлу либо с помощью os.path.join(directory, filename) или pathlib.Path(directory)/filename,
  • или вы можете заменить ваш вызов os.listdir на os.scandir, что дает DirEntry объект с атрибутами name и path, которые вы можете соответственно использовать в своем тесте и в качестве аргумента pdftotext.
...