2016-12-31 1 views
0

내 오류의 전체 역 추적은 다음과 같습니다비슷한 케이스에서 잘 작동하는 것으로 보이는 스레드 된 pyside 코드에서 'TypeError :'list 'object'를 호출 할 수 없습니다 '오류를 어떻게 해결할 수 있습니까?

> python zthreadtest_tjedit.py

None

Traceback (most recent call last):

File "zthreadtest_tjedit.py", line 17, in run self.function()

TypeError: 'list' object is not callable

내가 그이 코드는 특정 비트 시스템이며 아마도 대부분의 사람들을위한 실행 가능한 예제로 제공되지 않습니다이다 죄송합니다. 잘만되면 누군가가 바로 볼 수있는 솔루션은 간단합니다. 현재 가져온 zpool을 사용하여 zfs를 실행하지 않고 weir.zfs 모듈이 설치된 * nix 플랫폼에있는 경우 비 스레드 코드가 활성화 된 빈 목록을 반환합니다 (스레딩 토글 코드의 주석 참조) . 스레딩 모듈이 활성화되면 위와 같이 오류가 발생합니다.

나를 혼란스럽게하는 것은 Jo Plaete (https://joplaete.wordpress.com/2010/07/21/threading-with-pyqt4/)의 두 번째 코드가 오류없이 실행된다는 것입니다.이 코드를 제 필요에 맞게 간단히 수정했습니다. EDIT :이 오류의 원인은 내 코드에서 사용되는 목록 개체와 관련이있을 수 있지만 필자는 여전히 내 작업을해야합니다.

제 질문은 : 스레드 모듈이 올바르게 실행되는 것과 같은 오류를 어떻게 해결합니까?

이것은 단순 해 보이지만 나는 절대적으로 곤란합니다. 이렇게 많은 것이 이것이 어떤 도움말 포럼 에나 게시 한 첫 번째 질문입니다! 나는 내 질문에 올바르게 대답했기를 바랍니다. 나는 어떤 도움을 주셔서 감사합니다.

내 코드, 훨씬 더 큰 pyside GUI 프로그램에서 : 나는 조 Plaete에서 모델

import PySide, sys 
from PySide import QtCore, QtGui 
from PySide.QtCore import * 
from PySide.QtGui import * 
import re, subprocess, threading 
from weir import zfs 

class WorkerThread(QThread): 
    def __init__(self, function): 
     QThread.__init__(self) 
     self.function = function 

    def __del__(self): 
     self.wait() 

    def run(self): 
     self.function() 
     return 


class MainZ(QMainWindow): 
    def __init__(self): 
     super(MainZ, self).__init__() 
     # print(self) 
     # imported_pools = self.get_imported() # No threading 
     imported_pools = self.thread_test() # Use threading module 

     print(imported_pools) 

    def thread_test(self): 
     self.threader = WorkerThread(self.get_imported()) 
     self.threader.start() 

    def get_imported(self): 
     pool_string = subprocess.getoutput(
      'zpool list |grep -v ^NAME.*SIZE.*ALLOC |grep -o ^[a-Z0-9]*') 
     imported_pools = re.split(r'\s *', pool_string) 
     return imported_pools 


app = QApplication(sys.argv) 
form = MainZ() 
app.exec_() 

코드 오류없이 나를 위해 작동 :

import sys, time 
from PySide import QtCore, QtGui 

class GenericThread(QtCore.QThread): 
def __init__(self, function, *args, **kwargs): 
    QtCore.QThread.__init__(self) 
    self.function = function 
    self.args = args 
    self.kwargs = kwargs 

def __del__(self): 
    self.wait() 

def run(self): 
    self.function(*self.args,**self.kwargs) 
    return 

class MyApp(QtGui.QWidget): 
def __init__(self, parent=None): 
    QtGui.QWidget.__init__(self, parent) 
    self.setGeometry(300, 300, 280, 600) 
    self.setWindowTitle('threads') 
    self.layout = QtGui.QVBoxLayout(self) 
    self.testButton = QtGui.QPushButton("test") 
    self.connect(self.testButton, QtCore.SIGNAL("released()"), self.test) 
    self.listwidget = QtGui.QListWidget(self) 
    self.layout.addWidget(self.testButton) 
    self.layout.addWidget(self.listwidget) 

def add(self, text): 
    """ Add item to list widget """ 
    print("Add: " + text) 
    self.listwidget.addItem(text) 
    self.listwidget.sortItems() 

def addBatch(self,text="test",iters= 5,delay=0.2): 
    """ Add several items to list widget """ 
    for i in range(iters): 
    time.sleep(delay) # artificial time delay 
    self.add(text+" "+str(i)) 

def test(self): 
    self.listwidget.clear() 
    self.genericThread = GenericThread(
    self.addBatch,"from generic thread ",delay=0.3) 
    self.genericThread.start() 


# run 
app = QtGui.QApplication(sys.argv) 
test = MyApp() 
test.show() 
app.exec_() 
+0

여기에 복사하여 붙여 넣지 않은 추적 코드에는 적어도 일부 대답이 있습니다. –

+0

내 편집 내용이 귀하가 언급 한 내용이되기를 바랍니다. 그곳에있는 아무 것도 나를 즉시 깨닫지 못했지만, 당신의 인도를 받아서 다시 그것을 통과 할 것입니다 ... – airhuff

+0

아직도 그것을 얻지 못하고 있습니다. Plaete의 'GenericThread'클래스를 사용하여 비슷한 미니 프로그램을 성공적으로 구현했습니다. (더 많은 작업 코드로 게시물을 오염시키지 않겠습니다.) 그런 식으로 전화를 걸려고하는 주 프로그램의 모든 부분에 오류가 있습니다. 내가 얻지 못하는 몇 가지 차이가있다. – airhuff

답변

1

self.threader = WorkerThread(self.get_imported()) 

해야합니다. 읽기

self.threader = WorkerThread(self.get_imported) 

스레드를 만들 때 함수를 호출하는 결과 (목록)가 아닌 함수 자체를 전달하려고합니다.

+0

Thx @NPE. 나는 이것을 시도해 보았고 그것이 나에게 같은 오류를주고 있다고 생각했다. 그러나 나는 그것이 나의 IDE 디버거의 버크에 불과하다는 것을 깨달았다. 명령 줄에서 코드를 실행하면 코드가 '없음'으로 인쇄되고 컨트롤 z를 누르기 전까지 멈 춥니 다. 스레딩 비트를 통해 실행하지 않으면 가져온 풀을 그대로 인쇄합니다. – airhuff

+0

@airhuff 작업자 스레드가 실행하는 함수의 결과를 인쇄하도록 코드가 작성되지 않았습니다. 코드는 작업자 스레드를 생성하는 함수의 결과를 인쇄합니다. –

+0

@NPE, 큰 진전. print 문을 올바른 위치에두면 가져온 풀을 인쇄 할 수 있습니다. 그래도 계속 걸리는 이유가 있습니까? Ctrl-Z를 눌러야 종료됩니다. – airhuff

관련 문제