我在运行这部分代码时不断收到错误。我尝试按照subprocess.check_output
文档的建议实现universal_newlines=True
,但遇到了同样的错误。为什么会发生这种情况,我该怎么做才能解决它?
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
实际上是为了在进程返回的代码未0
时引发CalledProcessError
。
这里这段代码是1
,这表明pdftotext
无法打开 pdf,要么是因为它不正确,要么是因为它找不到它。
您正在使用os.listdir
,它生成相对于directory
参数的文件名,该参数不一定与默认情况下check_output
将在其中启动pdftotext
的当前工作目录相同。
我可以看到三种解决方案:
- 您可以使用
check_output
的cwd
参数在directory
中启动pdftotext
, - 您可以使用
os.path.join(directory, filename)
或pathlib.Path(directory)/filename
重建文件的相对路径, - 或者,您可以将
os.listdir
调用替换为os.scandir
,这将生成一个同时具有name
和path
属性的DirEntry
对象,您可以分别在测试中使用该对象并用作pdftotext
的参数。