파이썬 스레딩 문자열 인수


156

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

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


49
각 줄 끝에 세미콜론이있는 이유는 무엇입니까?
Maikflow

@Maikflow 좋은 연습입니까? ASI는 세미콜론이 아닌 행을 백그라운드에서 세미콜론으로 변환합니다.
IK

답변:


296

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

추가 ','를 추가하십시오.

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 기능. 하나의 요소 목록을 전달하면 해당 요소를 첫 번째 인수-귀하의 경우 문자열로 전달합니다.


1
두 번째 코드 블록의 두 번째 줄 끝에 추가 괄호가 있습니다. 편집하고 싶었지만 6 자 미만
harmonickey

arg2가 기본값 인 경우이를 수행하십시오. threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
DeveScie

8

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

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

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

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

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.