2017-07-23 6 views
1

Ich arbeite gerade daran, Code zu ändern, den ich auf Github gefunden habe. Es ist für einen Spektrumanalysator mit ath9k-basierten Wireless-Karten.Python len() gibt keine ganzen Zahlen zurück

Sowieso ist das Problem mit diesem Stück Code hier:

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)) 

Ich erwarte, dass die letzte print-Anweisung, immer den Wert „56“ produzieren, aber ich habe in einige seltsamen Verhalten führen. Hier ist eine Beispielausgabe:

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 

Das macht für mich keinen Sinn. Ich habe die Dokumentation für len() und struct.unpack_from() überprüft, bin aber nirgendwohin gekommen. Die Proben sollten 56 Ein-Byte-Zahlen enthalten aber gelegentlich erhalte ich ungerade Werte wie „56S 10,237633“

Github Projekt Repo Ich kann mich zu modifizieren oben von spectrum_file.py in Zeile 87

beginnend bei https://github.com/bcopeland/speccy Codebeispiel finden

Irgendwelche Ideen? Danke

+2

Können Sie dies auf ein minimales Beispiel reduzieren? –

+1

Ist das Skript single-threaded? Ist die Einrückung korrekt? –

+0

@JonasAdler Nein, ich kann es nicht auf ein minimales Beispiel reduzieren. Die seltsame "56S 12.322341" -Ausgabe erfolgt zufällig. – Zoroshino

Antwort

2

Wie von @kchomski erwähnt, ist Ihr Problem aufgrund eines anderen Teils Ihres Programms Schreiben an stderr.

fand ich die folgende Codezeile in speccy.py, die ich glaube, ist die unerwartete Ausgabe verursacht:

import sys 

sys.stderr.write('TOSTDERR\r') 
print('54') 

die Ausgänge::

sys.stderr.write('FPS %f \r' % (sum(self.fps)/len(self.fps))) 

Ein MVCE folgend wären

54STDERR 

Das Wagenrücklaufzeichen \r bewegt Ihren Cursor zurück zum Anfang der Zeile und dann wird 54 über dem gedruckt, was zuvor in stderr geschrieben wurde.

Sie können das Problem lösen, indem \r zu \n Schalen, die eine neue Zeile am Ende der Ausgabe stderr und vermeiden dieses Problem überschreiben setzen.