Python BUG 或者我不明白编码是如何工作的? len、find 和 re.search 在没有空的、成功的 subprocess.communicate() 执行结果的情况下啥也不做

Posted

技术标签:

【中文标题】Python BUG 或者我不明白编码是如何工作的? len、find 和 re.search 在没有空的、成功的 subprocess.communicate() 执行结果的情况下啥也不做【英文标题】:Python BUG or I don't get how encoding works? len, find, and re.search do nothing with no empty, successful subprocess.communicate() execution resultPython BUG 或者我不明白编码是如何工作的? len、find 和 re.search 在没有空的、成功的 subprocess.communicate() 执行结果的情况下什么也不做 【发布时间】:2013-04-17 13:46:28 【问题描述】:

出于某种我无法理解的原因,我不能对 Popen.communicate 的输出做任何事情,除了将其打印到终端。

如果我将输出保存到变量中,则该变量包含文本,因为我也可以将其打印到终端,但是 len 返回 0,re.search 不匹配,并且 find 总是返回 -1。

违规函数:

#!/usr/bin/env python # 编码:utf-8 导入操作系统 导入系统 导入getopt 导入子流程 导入 os.path 重新进口 def get_video_duration (ifile): p = subprocess.Popen(["ffprobe", ifile], stdout=subprocess.PIPE) info_str = p.communicate()[0].decode(sys.stdout.encoding) print(info_str) # 用于调试,文件信息打印正常 duration_start = info_str.find("持续时间") # duration_start = "AJDKLAJSL Duration:".find("Duration"), 这个测试没问题 duration_end = info_str.find("开始", duration_start) number_start = info_str.find(" ", duration_start, duration_end) + 1 number_end = info_str.find(",", number_start, duration_end) temp = info_str[number_start:number_end].split(":") 返回 int(temp[0]) * 60 * 60 + int(temp[1]) * 60 + int(temp[2])

我尝试了不同的变化。就像不使用 .decode(),将 find 更改为单个 re.search,通过迭代每个字符来实现我自己的 find(问题是我需要 len,而 len 总是为那个特定的字符串/字节数组返回 0)。

这是某种错误,或者我在字符串编码方面做错了。我无法弄清楚究竟是什么问题。任何帮助表示赞赏。

Ubuntu 12.10 64 位 Python 2.7

【问题讨论】:

请展示一个代码示例,包括数据,以显示您描述的行为。即打印数据、打印find的返回值等 【参考方案1】:

您在编码方面没有做错任何事情。您的问题是 ffprobe 将其输出(包括您要查找的持续时间信息)发送到标准错误,而不是标准输出。这样做,你应该没问题:

def get_video_duration (ifile):
    p = subprocess.Popen(["ffprobe", ifile], stderr=subprocess.PIPE)
    info_str = p.communicate()[1].decode(sys.stderr.encoding)

您的 print() 调用 似乎 正常工作的原因是它没有打印任何内容(因为 info_str 确实是空的)......但是 stderr 输出被转储到控制台,这给了你你所看到的是你的 print() 调用的结果的错觉。

【讨论】:

问题正是你所说的。 ffprobe 正在打印到标准错误。正如我所做的 stdout=subprocess.PIPE 一样,ffprobe 的任何输出都不应该在终端中(至少是标准输出),并且我确信终端中显示的任何文本都是我调用打印的结果。为 stderr 更改标准输出解决了它。在 Popen 中同时设置 stderr 和 stdout 可以让我自己注意到它,但我当时没有想到。

以上是关于Python BUG 或者我不明白编码是如何工作的? len、find 和 re.search 在没有空的、成功的 subprocess.communicate() 执行结果的情况下啥也不做的主要内容,如果未能解决你的问题,请参考以下文章

C中的简单堆栈程序

我不明白这个 javascript 函数是如何工作的

我不明白 Westpac Payway API 和 NET 是如何工作的

MekaVerse NFT 智能合约正在使用 ECDSA,但我不明白它是如何工作的

我不明白注入依赖是如何工作的。有没有人可以清楚地解释我

我不明白 Google Play 游戏服务的工作原理?