PyPDF2:将输出写入标准输出失败 python3
PyPDF2: writing output to stdout fails with python3
我正在尝试将 Python 3.7.2 与 PyPDF2 1.26 一起使用到 select 输入 PDF 文件的某些页面并将输出写入标准输出(实际代码更复杂,这是只是一个 MCVE):
import sys
from PyPDF2 import PdfFileReader, PdfFileWriter
input = PdfFileReader("example.pdf")
output = PdfFileWriter()
output.addPage(input.getPage(0))
output.write(sys.stdout)
失败并出现以下错误:
UserWarning: File <<stdout>> to write to is not in binary mode. It may not be written to correctly. [pdf.py:453]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.7/site-packages/PyPDF2/pdf.py", line 487, in write
stream.write(self._header + b_("\n"))
TypeError: write() argument must be str, not bytes
问题好像是sys.stdout
没有以二进制模式打开。正如一些答案所暗示的那样,我尝试了以下方法:
output.write(sys.stdout.buffer)
失败并出现以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.7/site-packages/PyPDF2/pdf.py", line 491, in write
object_positions.append(stream.tell())
OSError: [Errno 29] Illegal seek
我也试过的答案:
sout = open(sys.stdout.fileno(), "wb")
output.write(sout)
失败并出现与上述相同的错误。
如何使用 PyPDF2 库将 PDF 输出到标准输出?
更一般地说,我如何正确地将 sys.stdout
切换到二进制模式(类似于 Perl 的 binmode STDOUT
)?
注意:无需告诉我可以用二进制模式打开文件并将 PDF 写入该文件。这样可行;但是,我特别想将 PDF 写入标准输出。
write(stream)
Writes the collection of pages added to this object out as a PDF file.
Parameters: stream
– An object to write the file to. The object must support the write
method and the tell
method, similar to a file object.
事实证明,如果不重定向到文件,sys.stdout.buffer
将无法 tell
,因此您不能将其用作 PdfFileWriter.write
的流。
假设您的脚本名为 myscript
。如果你只调用 myscript
,那么你会得到这个错误,但如果你将它与重定向一起使用,如:
myscript > myfile.pdf
然后 Python 明白这是一个可搜索的流,您不会收到错误。
我正在尝试将 Python 3.7.2 与 PyPDF2 1.26 一起使用到 select 输入 PDF 文件的某些页面并将输出写入标准输出(实际代码更复杂,这是只是一个 MCVE):
import sys
from PyPDF2 import PdfFileReader, PdfFileWriter
input = PdfFileReader("example.pdf")
output = PdfFileWriter()
output.addPage(input.getPage(0))
output.write(sys.stdout)
失败并出现以下错误:
UserWarning: File <<stdout>> to write to is not in binary mode. It may not be written to correctly. [pdf.py:453]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.7/site-packages/PyPDF2/pdf.py", line 487, in write
stream.write(self._header + b_("\n"))
TypeError: write() argument must be str, not bytes
问题好像是sys.stdout
没有以二进制模式打开。正如一些答案所暗示的那样,我尝试了以下方法:
output.write(sys.stdout.buffer)
失败并出现以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.7/site-packages/PyPDF2/pdf.py", line 491, in write
object_positions.append(stream.tell())
OSError: [Errno 29] Illegal seek
我也试过
sout = open(sys.stdout.fileno(), "wb")
output.write(sout)
失败并出现与上述相同的错误。
如何使用 PyPDF2 库将 PDF 输出到标准输出?
更一般地说,我如何正确地将 sys.stdout
切换到二进制模式(类似于 Perl 的 binmode STDOUT
)?
注意:无需告诉我可以用二进制模式打开文件并将 PDF 写入该文件。这样可行;但是,我特别想将 PDF 写入标准输出。
write(stream)
Writes the collection of pages added to this object out as a PDF file.
Parameters:
stream
– An object to write the file to. The object must support thewrite
method and thetell
method, similar to a file object.
事实证明,如果不重定向到文件,sys.stdout.buffer
将无法 tell
,因此您不能将其用作 PdfFileWriter.write
的流。
假设您的脚本名为 myscript
。如果你只调用 myscript
,那么你会得到这个错误,但如果你将它与重定向一起使用,如:
myscript > myfile.pdf
然后 Python 明白这是一个可搜索的流,您不会收到错误。