我目前正在修改我在Github上找到的一些代码。它适用于使用基于ath9k的无线网卡的频谱分析仪。
无论如何,问题在于这里的代码:
sdata = struct.unpack_from("56B", data, pos)
pos += 56
# calculate power in dBm
sumsq_sample = 0
samples = []
for raw_sample in sdata:
if raw_sample == 0:
sample = 1
else:
sample = raw_sample << max_exp
sumsq_sample += sample*sample
samples.append(sample)
print (len(samples))
我希望最后一个print语句总是产生值“56”,但是我遇到了一些奇怪的行为。以下是一些示例输出:
56
56
56
56
56
56
56S 15.952354
56
56
56
56
56
56
56
56
56
56
56
56
56S 15.689883
56
56S 16.510071
56
56S 17.591084
56S 18.358299
56
56
56
56
56
56
56
56
56
56
56
56
56
56
56
56
56
56
56
这对我没有意义。我检查了len()和struct.unpack_from()的文档,但没有得到任何地方。样本应包含56个单字节整数,但有时我会得到奇怪的值,如“56S 10.237633”
我正在修改的项目的Github回购可以在https://github.com/bcopeland/speccy找到 上面的代码示例来自从第87行开始的spectrum_file.py
有什么想法吗?感谢
答案 0 :(得分:2)
如@kchomski所述,您的问题是由于您的计划的另一部分写入stderr
。
我在speccy.py
中找到了以下代码行,我认为这会引起意外输出:
sys.stderr.write('FPS %f \r' % (sum(self.fps) / len(self.fps)))
MVCE如下:
import sys
sys.stderr.write('TOSTDERR\r')
print('54')
输出:
54STDERR
回车符\r
正在将光标移回行首,然后54
打印在之前写入stderr
的内容之上。
您可以通过将\r
切换为\n
来解决此问题,这会在输出结尾处将新行放到stderr
并避免此覆盖问题。