8

この python ソース コードの何が問題になっていますか?

import threading
import subprocess as sub

def ben(fil):
    pr = sub.Popen(fil,stdout=sub.PIPE,stderr=sub.PIPE)
    output, errors = pr.communicate()
    print output

theapp = '''blender
            blender-softwaregl'''.split()
print theapp

for u in theapp:
    print u
    tr = threading.Thread(target=ben, args=(u))
    tr.daemon = True
    tr.start()

エラーは次のとおりです。

['blender', 'blender-softwaregl']
blender
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/threading.py", line 551, in __bootstrap_inner
    self.run()
  File "/usr/local/lib/python2.7/threading.py", line 504, in run
    self.__target(*self.__args, **self.__kwargs)
TypeError: ben() takes exactly 1 argument (7 given)

blender-softwaregl
Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/threading.py", line 551, in __bootstrap_inner
    self.run()
  File "/usr/local/lib/python2.7/threading.py", line 504, in run
    self.__target(*self.__args, **self.__kwargs)
TypeError: ben() takes exactly 1 argument (18 given)

これは私の問題です。このエラーは何ですか?

 TypeError: ben() takes exactly 1 argument (18 given)
4

2 に答える 2

18

へのargs引数にthreading.Threadはシーケンスが必要ですが、文字列を指定しています。これにより、文字列の各文字が個々の引数として解釈され、ターゲット関数の引数が多すぎます。

あなたは正しいコードを手に入れることに非常に近づいています。括弧内に末尾のコンマを追加して、タプル構文を修正するだけです。

tr = threading.Thread(target=ben, args=(u,)) # comma makes args into a 1-tuple
于 2012-12-18T21:21:53.750 に答える
0

何らかの理由で、文字列ではなく引数として文字のリストを渡しているようです。

ブレンダーに7文字が含まれているため、タイプエラー7の引数が渡されました。また、blender-softwareglには18文字あるため、1つではなく18の引数に対してタイプエラーが発生します。

サブプロセスに複数の引数を渡したい場合。Popen、変数名fillと値リストを含む辞書を渡してみてください。

def ben(fil):
    pr = sub.Popen(fil,stdout=sub.PIPE,stderr=sub.PIPE)
    output, errors = pr.communicate()
    print output

d = {'fil':['command1', 'command2']}

ben(**d)

もう一つ。サブプロセスを開いているのに、なぜスレッドを開いているのですか?サブプロセスは別のプロセスであり、スレッド部分は必要ありません。そして、あなたのコードはスレッド部分がなくても機能すると思います。

于 2012-12-18T13:32:51.540 に答える