2010-01-15 17 views
16

मैं पीईक्यूटी 4 का उपयोग कर एक जीयूआई प्रोग्राम लिख रहा हूं। मेरी मुख्य विंडो में एक बटन है और इस बटन पर क्लिक करके। मुझे पृष्ठभूमि प्रक्रिया लॉन्च करने की उम्मीद है जो प्रसंस्करण से व्युत्पन्न कक्षा का एक उदाहरण है। प्रक्रिया।मल्टीप्रोसेसिंग समस्या [pyqt, py2exe]

class BackgroundTask(processing.Process): 
    def __init__(self, input): 
     processing.Process.__init__(self) 
     ... 

    def run(self): 
     ... 

(ध्यान दें कि मैं http://code.google.com/p/python-multiprocessing/ है यही कारण है कि यह processing.Process बजाय multiprocessing.Process है से Python2.5 बंदरगाह अजगर-बहु प्राप्त की उपयोग कर रहा हूँ। मुझे लगता है कि यह होना चाहिए नहीं एक फर्क। मैं सही हूँ?)

बटन क्लिक संकेत से जुड़ा कोड बस

की तरह कुछ है
processing.freezeSupport() 
task = BackgroundTask(input) 
task.start() 

प्रोग्राम पायथन intepreter के तहत अपेक्षित काम करता है, यानी यदि यह कमांड लाइन "python myapp.py" से शुरू होता है।

हालांकि, जब मैं उस बटन पर क्लिक करें, बजाय पृष्ठभूमि कार्य शुरू करने की बाद मैं इस कार्यक्रम पैकेज py2exe का उपयोग कर, हर, मुख्य विंडो की एक प्रति दिखाई नहीं देता। मुझे यकीन नहीं है कि इस व्यवहार का कारण क्या है। मुझे लगता है कि यह निम्नलिखित टिप्पणी से संबंधित है http://docs.python.org/library/multiprocessing.html#multiprocessing-programming

पर संबोधित "इस पैकेज के भीतर कार्यशीलता कि मुख्य विधि बच्चों द्वारा आयात योग्य हो की आवश्यकता है। यह प्रोग्रामिंग दिशा-निर्देशों में कवर किया जाता है, लेकिन यह यहाँ उनका कहना है लायक है । इसका मतलब यह है कि इस तरह के multiprocessing.Pool उदाहरण के रूप में कुछ उदाहरण, इंटरैक्टिव दुभाषिया में काम नहीं करेगा "

केवल जगह अगर नाम == मेरे पास है" मुख्य "मुख्य मॉड्यूल में हैएक ठेठ PyQt कार्यक्रम

if __name__ == "__main__": 
    a = QApplication(sys.argv) 
    QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()")) 
    w = MainWindow() 
    w.show() 
    a.exec_() 

कैसे इस समस्या को दूर करने के लिए पर कोई समाधान के रूप में? धन्यवाद!

+0

आप स्पष्ट कर सकते हैं: अजगर 3 के लिए, यह कैसा दिखेगा आप बहु डॉक्स में वर्णित के रूप में मुख्य मॉड्यूल संरक्षित है? या आपके पास मुख्य मॉड्यूल तक पहुंच नहीं है (मुझे नहीं पता कि pyqt कैसे काम करता है)? यह भी जांचने लायक है कि आप py2exe के नवीनतम संस्करण का उपयोग कर रहे हैं। मुझे अतीत में समस्याएं आईं जो कि py2app/py2exe – James

+0

से बाहर हो गईं, टिप्पणी के लिए धन्यवाद। मैंने अभी अपनी पोस्ट में __name__ == "__main__" भाग जोड़ा है। निश्चित नहीं है कि मैं मुख्य मॉड्यूल की रक्षा कर रहा हूं या नहीं। Http://sourceforge.net/projects/py2exe/files/ से मिले py2exe का नवीनतम संस्करण 2008-11-16 को जारी किया गया था, इसलिए मुझे लगता है कि मैं py2exe का नवीनतम संस्करण उपयोग कर रहा हूं। –

उत्तर

26

मुझे लगता है कि अपने वास्तविक समस्या यह के साथ क्या करना है:

कार्यक्रम, अजगर intepreter के तहत की उम्मीद अर्थात अगर यह कमांड लाइन "अजगर myapp.py" से शुरू होता है के रूप में काम करता है।

हालांकि, जब मैं py2exe का उपयोग कर प्रोग्राम को पैकेज करता हूं, हर बार जब मैं उस बटन पर क्लिक करता हूं,> पृष्ठभूमि कार्य शुरू करने के बजाय, मुख्य विंडो की एक प्रति पॉप अप हो जाती है।

if __name__ == "__main__": 
    # add freeze support 
    processing.freeze_support() 
    a = QApplication(sys.argv) 
    QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()")) 
    w = MainWindow() 
    w.show() 
    a.exec_() 

संदर्भ:: http://docs.python.org/library/multiprocessing.html#multiprocessing.freeze_support

आप "स्थिर" निष्पादनयोग्य (जैसे, py2exe के साथ किया जाता है) के साथ बहु मॉड्यूल काम करने के लिए freeze_support() फ़ंक्शन के लिए एक विशेष कॉल जोड़ने की जरूरत

+1

+1: कुछ समय पहले ठीक उसी समस्या में भाग गया, सटीक उसी फिक्स का उपयोग किया। –

+1

बहुत बहुत धन्यवाद। यह काम करता हैं! मैं इस freeze_support() फ़ंक्शन से अवगत था लेकिन मैंने इसे सही जगह पर नहीं रखा। इसे = QAplication (sys.argv) से पहले डालने के बजाय, मैंने इसे एक नई प्रक्रिया उदाहरण बनाने से पहले हर बार रखा, जो लगता है कि काम नहीं करता है। –

0

"इस पैकेज के भीतर कार्यक्षमता की आवश्यकता है कि मुख्य विधि बच्चों द्वारा आयात योग्य हो।"

मुझे लगता है कि इसका मतलब है कि आपको कहीं भी मुख्य() फ़ंक्शन परिभाषित करना होगा।

0

प्रश्न पायथन 2 से संबंधित है और हल किया गया था।

from multiprocessing import freeze_support 

if __name__ == '__main__': 
    freeze_support() 

    a = QApplication(sys.argv) 
    ...