簡體   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