Python wave 模块仅适用于 v2.7,不适用于 v3.4 linux

Posted

技术标签:

【中文标题】Python wave 模块仅适用于 v2.7,不适用于 v3.4 linux【英文标题】:Python wave module only working in v2.7 not in v3.4 linux 【发布时间】:2016-03-26 06:08:11 【问题描述】:

浪费了很多时间试图在 python 中编写一个波形文件,以发现它在 python 3.4.2 上不起作用,但在 python 2.7.9 上确实起作用

我正在使用 Debian jessie 并安装了两个版本的 python。如果我只是在命令提示符下写“python”,它会启动 python 2.7.9

我正在测试的代码是这样的:

import wave

frame_rate = 44100
bit_depth = 16
bits_per_byte = 8
num_channels = 2

wOut = wave.open("out.wav","w")
wOut.setparams((num_channels, (bit_depth / bits_per_byte), frame_rate, (frame_rate * duration), 'NONE', 'not compressed'))

wOut.close()

如果我使用 python 2.7.9 运行该代码,我会得到一个只有波头的健康 wav 文件。 如果我使用 python 3.4.2 运行相同的代码,我会收到此错误:

File "/usr/lib/python3.4/wave.py", line 433, in close
    self._ensure_header_written(0)
  File "/usr/lib/python3.4/wave.py", line 455, in _ensure_header_written
    self._write_header(datasize)
  File "/usr/lib/python3.4/wave.py", line 472, in _write_header
    self._sampwidth * 8, b'data'))
struct.error: required argument is not an integer

并且wave文件只包含header的前4个字节。

我没有在网上找到任何文档说明这是 python 3.4 中的一个问题,所以我猜这可能是我的多版本 python 安装的问题。

也许我拥有的 wave 模块仅适用于 python 2.7? 我相信这不是我第一次遇到这种问题,我正在考虑只在 2.7 中工作,但我不想这样做。

任何命中都将不胜感激

【问题讨论】:

【参考方案1】:

您将 sample_width 设置为 (bit_depth / bits_per_byte),它在 python 2 上是一个整数,在 python 3 上是一个浮点数。

要在 python 2 和 3 上使用整数除法,请使用 (bit_depth // bits_per_byte)

【讨论】:

【参考方案2】:

默认情况下您需要 floordiv、(bit_depth // bits_per_byte)、python2 楼层,python3 默认使用 truediv,因此您在 python 3 中传递 float 而在 python 2 中传递 int

wOut.setparams((num_channels, (bit_depth // bits_per_byte), frame_rate, (frame_rate * 12), 'NONE', 'not compressed'))

【讨论】:

以上是关于Python wave 模块仅适用于 v2.7,不适用于 v3.4 linux的主要内容,如果未能解决你的问题,请参考以下文章

Silverlight 中 Wave 文件的声音可视化工具

python wave模块可以接受StringIO对象吗

import pymongo 适用于 Python 解释器,但不适用于脚本

回溯数独仅适用于 Python 3

Python 从零开始制作自己的声音 - wave模块读写wav文件详解

删除python模块?