2016-10-10 5 views
1

私はそれが簡単ではないにもかかわらず、全員が理解することを望んで、私は明確にしようとします。 私はPythonでコーディングの初心者ですので、すべての助けが素敵です! 私はそれらのlibrairies import:要求とスレッドを持っています。 私はデータの送信時間を短縮するためにいくつかのURLをparrallelで送信しようとしています。私はすべてのURLをスタックするために動的リストを使用し、それらを送信するためにrequests.postを使用しました。スレッドとダイナミックなリストのPythonでの問題

l=[] 
     if ALARM&1: 
      alarmType="Break Alarm" 
      AlarmNumber = 1 
      sendAlarm(alarmType, AlarmNumber) 
      print alarmType 
     else: 
      s = "https://..." #the url works 
      l.append(threading.Thread(target=requests.post, args=(s))) 
     if ALARM&2: 
      alarmType=0 
     if ALARM&4: 
      alarmType="Limit Switch" 
      AlarmNumber = 2 
      sendAlarm(alarmType, AlarmNumber) 
      print alarmType 
     else: 
      s="https://..." 
      l.append(threading.Thread(target=requests.post, args=(s))) 

     for t in l: 
      t.start() 
     for t in l: 
      t.join() 

私が得たエラーは次のとおりです。スレッド2用

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner 
    self.run() 
    File "/usr/lib/python2.7/threading.py", line 763, in run 
    self.__target(*self.__args, **self.__kwargs) 
TypeError: post() takes at most 3 arguments (110 given) 

そして同じ事、私は私の周りに尋ねたが、我々は解決策を見つけることができません。誰かがアイデアを持っているなら?ありがとう!

答えて

2

docsから、argsはタプルでなければなりません。

クラスthreading.Thread(グループ=なし、目標=なし、名前=なし、引数=()、kwargsから= {})

引数は、ターゲット呼び出しの引数タプルです。デフォルトは()です。あなたが最初の(そして唯一の)要素としてURLをargsタプルを渡す必要があり

:セットとして

l.append(threading.Thread(target=requests.post, args=(s,))) 

ここで、一見役に立たないコンマはPyhtonは(S)を解釈するもので、不要な括弧で囲まれた文字列だけではありません。これを行うに失敗

は、あなたは基本的に文字列を渡すと、その上にThread反復処理し、それゆえエラーメッセージ別の引数としてpost各文字を渡している:

TypeError: post() takes at most 3 arguments (110 given) 

文字列イテレータとして解釈されることは共通の落とし穴です。関数/メソッドはリスト/集合を期待し、"https://..."のような文字列が与えられると、['"', 'h', 't', 't', 'p', 's', ':', '/', '/',...]のように扱います。

問題の根本的な原因は、何とかして事例です。興味深いのは、質問を読むときに私がThreadの何も知りませんでしたが、エラーメッセージ(TypeError: post() takes at most 3 arguments (110 given))がすぐに正しい方向を指摘しました。

+1

'args =(s、)'を使うとタプルを定義するのに十分ですが、周りに余分なカッコが必要ではないと思いますか?また、OPの問題の根本的原因である単一要素タプルでは、​​それをタプルにするためにカンマが必要であることを明確にする価値はあると私は考える。 – SiHa

+0

@SiHa:良い点。 OPはセットを使用することを意図したが、その特定のポイントを逃した可能性が高い。 –

+0

ありがとうJérômeその仕事!私はそれで時間を過ごしました!私はより慎重で、ドキュメントをもっと見ているべきです..もう一度ありがとう! – GarennePb