繁体   English   中英

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标头的健康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文件仅包含头的前4个字节。

我还没有找到任何在线文档,说明这是python 3.4中的问题,所以我猜测可能是我的multiversion python安装出现问题。

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

任何命中将不胜感激

您需要floordiv (bit_depth // bits_per_byte) ,默认情况下为python2 floor,默认情况下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'))

您将sample_width设置为(bit_depth / bits_per_byte) ,在python 2上为整数,在python 3上为float。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM