web-dev-qa-db-ja.com

スレッドの例外:インスタンスではなくシーケンスである必要があります

pythonに取り組んでいて、1つのパラメーター "q"を受け取るスレッドを実行しようとしていますが、実行しようとすると、奇妙な例外が発生します。コードは次のとおりです。

class Workspace(QMainWindow, Ui_MainWindow):
    """ This class is for managing the whole GUI `Workspace'.
        Currently a Workspace is similar to a MainWindow
    """

    def __init__(self):

        try:
            from Queue import Queue, Empty
        except ImportError:
    #from queue import Queue, Empty  # python 3.x
            print "error"

        ON_POSIX = 'posix' in sys.builtin_module_names

        def enqueue_output(out, queue):
            for line in iter(out.readline, b''):
                queue.put(line)
            out.close()

        p= Popen(["Java -Xmx256m -jar bin/HelloWorld.jar"],cwd=r'/home/karen/sphinx4-1.0beta5-src/sphinx4-1.0beta5/',stdout=PIPE, Shell=True, bufsize= 4024)
        q = Queue()

        t = threading.Thread(target=enqueue_output, args=(p.stdout, q))
        #t = Thread(target=enqueue_output, args=(p.stdout, q))

        t.daemon = True # thread dies with the program
        t.start()

# ... do other things here
        def myfunc(q):
            while True:

                try: line = q.get_nowait()
         # or q.get(timeout=.1)
                except Empty:
                    print('')
                else: # got line
    # ... do something with line
                    print "No esta null"
                    print line  


        thread = threading.Thread(target=myfunc, args=(q))
        thread.start()

次のエラーで失敗します。

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 504, in run
    self.__target(*self.__args, **self.__kwargs)
TypeError: myfunc() argument after * must be a sequence, not instance

何が起こっているのかわからない!助けてください!

27
karensantana

threading.Threadへのargsパラメーターはタプルである必要があり、(q)を渡しています。これはqと同じです。

1要素のタプルが必要だったと思います。(q,)と書く必要があります。

44
Tibo