2016-09-18 6 views
-1

パイプで出力された出力をPythonに分割しようとするとエラーが発生します。Python値のエラー

エラーがneed more than 3 values to unpack私は8つの値

import subprocess, sys 

from datetime import datetime 

from time import sleep as sleep 



multimon_ng = subprocess.Popen("multimon-ng -a FLEX -t wav flex.wav", 
    stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE, 
    shell=True) 

while True: 
     nextline = multimon_ng.stdout.readline() 
     flex, mdate, mtime, bitrate, other, capcode, o2, msg = nextline.split(" ", 7)  # error here 
     if nextline is " ": 
      print "napping" 
     else: 
      print mdate + " " + mtime + " " + capcode + " " + msg 

     multimon_ng.poll() 
     sys.stdout.flush() 

を使用していているが、任意のヘルプは、エラーメッセージに

+0

こんにちは@shaggs、これはかなり明確にApache Flexの質問ではないので、私は 'flex'タグを削除しました。私はこの文脈であなたが「フレックス」を意味するかどうか分からないので、それを取り戻す方法はわかりません。それは高速語彙アナライザですか?他に何か? – Brian

+0

@Brian FLEXもページングプロトコルです。それがこの質問でどのように使われているかhttps://en.m.wikipedia.org/wiki/FLEX_(protocol) – shaggs

+0

ああ、そうだ。残念ながら、私はそれのためのタグを持っているとは思わない:( – Brian

答えて

2

3素晴らしいことだ右側の引数に反復可能の長さを示しました。

最小間違った例:

a, = [] # ValueError: need more than 0 values to unpack 
a, b = [1] # ValueError: need more than 1 value to unpack 
a, b, c = [1, 2] # ValueError: need more than 2 values to unpack 
# etc ... 

最小正しい例:問題を修正して公開する

a, = [1] 
a, b = [1, 2] 
a, b, c = [1, 2, 3] 

最小の変化は、try-除くブロックで反復可能な開梱ラップすることです。

while True: 
    nextline = multimon_ng.stdout.readline() 

    if not nextline: 
     print "napping" 
    else: 
     try: 
      flex, mdate, mtime, bitrate, other, capcode, o2, msg = nextline.split(" ", 7) 
     except ValueError: 
      print "invalid line", nextline 
     else: 
      print mdate + " " + mtime + " " + capcode + " " + msg 

    multimon_ng.poll() 
    sys.stdout.flush() 

ご覧のとおり、私はアンパックする前に空行がないかチェックしました。行が空の場合は、展開も失敗します。

+0

働いてくれてありがとう...レッスンtryとcatchについて学んだ – shaggs