[python] 파이썬 스레딩 문자열 인수

파이썬 스레딩 및 인수에 문자열을 보내는 데 문제가 있습니다.

def processLine(line) :
    print "hello";
    return;

.

dRecieved = connFile.readline();
processThread = threading.Thread(target=processLine, args=(dRecieved));
processThread.start();

여기서 dRecieved는 연결로 읽은 한 줄의 문자열입니다. 현재 “hello”인쇄 작업이 하나 뿐인 간단한 함수를 호출합니다.

그러나 나는 다음과 같은 오류가 발생합니다

Traceback (most recent call last):
File "C:\Python25\lib\threading.py", line 486, in __bootstrap_inner
self.run()
File "C:\Python25\lib\threading.py", line 446, in run
self.__target(*self.__args, **self.__kwargs)
TypeError: processLine() takes exactly 1 arguments (232 given)

232는 전달하려는 문자열의 길이이므로 각 문자로 분리하여 그러한 인수를 전달하려고합니다. 함수를 정상적으로 호출하면 정상적으로 작동하지만 별도의 스레드로 설정하고 싶습니다.



답변

튜플을 만들려고하지만 문자열을 괄호로 묶는 것입니다. 🙂

추가 ‘,’를 추가하십시오.

dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=(dRecieved,))  # <- note extra ','
processThread.start()

또는 괄호를 사용하여 목록을 만드십시오.

dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=[dRecieved])  # <- 1 element list
processThread.start()

스택 추적에서 알 수있는 경우 : self.__target(*self.__args, **self.__kwargs)

*self.__args로 전달, 문자 목록으로 문자열을 회전 processLine
기능. 하나의 요소 목록을 전달하면 해당 요소를 첫 번째 인수-귀하의 경우 문자열로 전달합니다.


답변

여기에 더 많은 배경 지식을 제공하기를 바랍니다.

먼저, threading :: Thread 메소드의 생성자 서명 :

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

args 는대상 호출에 대한인수 튜플 입니다. 기본값은 ()입니다.

둘째, 파이썬 의 단점tuple다음과 같습니다.

빈 튜플은 빈 괄호 쌍으로 구성됩니다. 하나의 항목있는 튜플쉼표로 값을 따라 구성됩니다 (단일 값을 괄호로 묶는 것으로는 충분하지 않습니다).

반면에 문자열은와 같은 일련의 문자 'abc'[1] == 'b'입니다. 따라서 args괄호 (여전히 찌르기)로도 문자열을로 보내면 각 문자는 단일 매개 변수로 처리됩니다.

그러나 Python은 통합되어 있으며 추가 인수를 허용 할 수있는 JavaScript와 다릅니다. 대신 TypeError에 불평을 던진다 .


답변