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

Python wave module only working in v2.7 not in v3.4 linux

花了很多时间尝试在 python 中编写 wave 文件,结果发现它在 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 的代码,我会得到一个只有 wave header 的健康 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 安装有问题。

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

任何命中将不胜感激

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

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

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

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