পাইথন থ্রেডিং স্ট্রিং আর্গুমেন্ট


156

আর্গুমেন্টগুলিতে পাইথন থ্রেডিং এবং স্ট্রিং প্রেরণে আমার একটি সমস্যা আছে।

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

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

যেখানে সংযুক্তি দ্বারা পঠিত এক লাইনের স্ট্রিংটি ডিআরসিভড। এটি একটি সাধারণ ফাংশনকে কল করে যা বর্তমানে "হ্যালো" মুদ্রণের কেবল একটি কাজ রয়েছে।

তবে আমি নিম্নলিখিত ত্রুটি পেয়েছি

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)

২৩২ হ'ল আমি যে স্ট্রিংটি দিয়ে যাবার চেষ্টা করছি তার দৈর্ঘ্য, সুতরাং আমি অনুমান করি যে এটি প্রতিটি চরিত্রের মধ্যে এটি ভেঙে গেছে এবং সেই জাতীয় যুক্তিগুলি পাস করার চেষ্টা করছে। আমি যদি ফাংশনটি কেবলমাত্র সাধারণভাবে কল করি তবে এটি ঠিকঠাক কাজ করে তবে আমি এটিকে পৃথক থ্রেড হিসাবে সেটআপ করতে চাই।


49
প্রতিটি লাইনের শেষে আপনার কেন অর্ধসীমা রয়েছে?
মাইকফ্লো

@ মাইকফ্লো এটা কি ভাল অভ্যাস নয়? এএসআই আধিক্যযুক্ত রেখাগুলিকে আফাইক হিসাবে ব্যাকগ্রাউন্ডে অর্ধবৃত্তে রূপান্তর করে।
আইকে

উত্তর:


294

আপনি একটি টিউপল তৈরি করার চেষ্টা করছেন, তবে আপনি কেবল একটি স্ট্রিং তৈরি করছেন :)

একটি অতিরিক্ত ',' যুক্ত করুন:

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

যদি আপনার ডিফল্ট মান সহ আরগ 2 থাকে তবে এটি করুন। threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
দেভস্কি

7

আমি এখানে আরও পটভূমি জ্ঞান প্রদান আশা করি।

প্রথমে পদ্ধতির থ্রেডিংয়ের কন্সট্রাক্টর স্বাক্ষর :: থ্রেড :

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

আরগস হ'লটার্গেট অলোকেশনের আর্গুমেন্ট টিপল । () এর ডিফল্ট।

দ্বিতীয়ত : পাইথনের এক দ্যুতিtuple

খালি টিপলগুলি খালি জোড়া বন্ধনী দ্বারা নির্মিত হয়; একটি আইটেম সহ একটি টুপল কমা দিয়ে মান অনুসরণ করে নির্মিত হয় (এটি প্রথম বন্ধনীতে কোনও মান আবদ্ধ করার জন্য যথেষ্ট নয়)।

অন্যদিকে, একটি স্ট্রিং হ'ল অক্ষরের ক্রম 'abc'[1] == 'b'। সুতরাং যদি কোনও স্ট্রিং প্রেরণ করা হয় args, এমনকি বন্ধনীতে (এখনও একটি স্টিং), প্রতিটি অক্ষরকে একক প্যারামিটার হিসাবে বিবেচনা করা হবে।

তবে পাইথন এত সংহত এবং এটি জাভাস্ক্রিপ্টের মতো নয় যেখানে অতিরিক্ত যুক্তি সহ্য করা যায়। পরিবর্তে, এটি TypeErrorঅভিযোগ করার জন্য একটি ছুড়ে ফেলে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.