Python Uudecode 调用损坏

Posted

技术标签:

【中文标题】Python Uudecode 调用损坏【英文标题】:Python Uudecode Call Corruption 【发布时间】:2015-09-24 01:24:09 【问题描述】:

我正在从 SEC 文件中提取 PDF。他们通常是这样来的:

SEC Filing Example

无论出于何种原因,当我将原始 PDF 保存为 .text 文件,然后尝试运行时

uudecode -o output_file.pdf input_file.txt

从 python subprocess.call() 函数或任何其他允许从命令行执行命令的 python 函数,生成的 PDF 文件已损坏。如果我直接从命令行运行相同的命令,则不会损坏。

仔细查看从 python 脚本输出的 PDF 文件时,看起来文件过早结束。从 python 执行命令行命令时是否存在某种输出限制?

谢谢!

【问题讨论】:

如果从命令行运行:python -muu -d input_file.txt output_file.pdf 会发生什么? @J.F.Sebastian 当我在命令行中运行它时,它起作用了。但只要我把它像这样放入我的代码中:subprocess.call([ "python", "-muu", "-d", input_file.txt, output_file.pdf]) 我也有同样的问题 不要将它作为 Python 脚本中的子进程运行,您可以将其导入:import uu; uu.decode('input_file.txt', 'output_file.pdf')(注意:文件名周围的引号不是可选的;它们在 Python 中创建一个字符串对象) .或者(更好)传递打开的二进制文件对象,例如,使用input_file = open('input_file.txt', 'rb'); output_file = open('output_file.pdf', 'wb') 创建的 【参考方案1】:

这个脚本对我在 Python 3.4.1 和 uudecode 4.15.2 的 Fedora 21 x86_64 上运行很好:

import subprocess
subprocess.call("uudecode -o output_file.pdf input_file.txt", shell=True)

使用链接的 SEC 文件(长度:173,141 B;sha1:e4f7fa2cbb3422411c2f2968d954d6bb9808b884),解码的 PDF(长度:124,557 B;sha1:1676320e1d9923e14d19451c16688198bc93ca0d)在查看时显示正确。

您的环境中可能存在其他问题导致问题。您可能想为您的问题添加更多详细信息。

从 python 执行命令行命令时是否存在某种输出限制?

如果“输出限制”是指uudecode 写入的文件的大小,则不是。使用subprocess 模块时唯一需要担心的“输出限制”类型是在创建子进程时传递stdout=PIPEstderr=PIPE。如果子进程向这些流中的任何一个写入足够的数据,并且您的脚本没有定期耗尽它们,则子进程将阻塞(请参阅subprocess 模块文档)。在我的测试中,uudecode 没有向stdoutstderr 写任何内容。

【讨论】:

感谢您的回复。我正在使用 Python 2.7.3、Ubuntu 精确(12.04.5 LTS)、uudecode 4.11。我可能会尝试更新到 uudecode 4.15,看看这是否对我的问题有帮助。编辑:我不认为 python 2.7 可以更新到 uudecode 4.1 你能在你的脚本中检查subprocess.call()的返回值吗?

以上是关于Python Uudecode 调用损坏的主要内容,如果未能解决你的问题,请参考以下文章

如何检查字符串是不是对 uudecode 有效

How do I install uudecode?

bash 脚本如何在不使用 uudecode 的情况下写出二进制文件?

管道到头部导致从 python 调用的 shell 脚本中的管道损坏

调用 SysFreeString() 时出现堆损坏错误

堆已损坏:调用非托管函数时