运行代码的这一部分时,我总是收到错误消息。我曾尝试按照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.

最佳答案

如评论中所述,当进程返回的代码不是check_output时, CalledProcessError 实际上意味着提高0

这里的代码是1,它指示pdftotext无法打开pdf,原因是它不正确或因为找不到它。

您正在使用 os.listdir ,它产生的文件名相对于directory参数,该文件名不一定与当前的工作目录相同,默认情况下check_output将在该工作目录中启动pdftotext

我可以看到三种解决方案:

  • 您可以使用cwdcheck_output参数在pdftotext
  • 中启动directory
  • 您可以使用 os.path.join(directory, filename) pathlib.Path(directory)/filename
  • 来重建文件的相对路径
  • 或您可以用 os.listdir 替换对os.scandir的调用,这会产生一个同时具有DirEntryname属性的 path 对象,您可以分别在测试中使用它们,并作为pdftotext的参数。
  • 关于python - CalledProcessError : Command '[' pdftotext', '-layout' , 'coburns.pdf' , '-' ]' returned non-zero exit status 1?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61561411/

    10-09 03:17