2015-03-18 18 views
5

के साथ काम नहीं करता है यह this question जैसा ही है, लेकिन दिए गए समाधान (फ्रीज_support() को कॉल करना मेरे लिए काम नहीं करता है।पायथन 3.4 मल्टीप्रोसेसिंग py2exe

मेरे पास start.py नामक निम्न स्क्रिप्ट है जिसका उपयोग मैं py2exe (संस्करण 0.9.2.2) के साथ एक स्टैंडअलोन निष्पादन योग्य बनाने के लिए करता हूं। मेरे पास एक ही निर्देशिका में python.exe है।

import multiprocessing 

def main(): 
    print('Parent') 
    p = multiprocessing.Process(target=new_process) 
    multiprocessing.set_executable('python.exe') 
    p.start() 
    p.join() 

def new_process(): 
    print('Child') 

if __name__ == '__main__': 
    multiprocessing.freeze_support() 
    main() 

शुद्ध पायथन के रूप में चलाने पर यह पूरी तरह से ठीक काम करता है। हालांकि, जब एक निष्पादन योग्य के रूप में पैक, यह त्रुटि मैं मिलता है:

Unknown option: -- 
usage: <path to start.exe> [option] ... [-c cmd | -m mod | file | -] [arg] ... 
Try `python -h' for more information. 

यह स्पष्ट रूप से बुला

python.exe --multiprocessing-fork 

अगर मैं set_executable कॉल नहीं करते() और freeze_support (के कारण होता है), बाल प्रक्रिया सिर्फ exe शुरू होती है और __main__ के रूप में चलती है, जिससे "माता-पिता" प्रिंट करने के लिए नई प्रक्रियाओं की एक अंतहीन श्रृंखला होती है जबकि "चाइल्ड" कभी मुद्रित नहीं होता है।

केवल एक चीज freeze_support बुला() करने के लिए लगता है बच्चा प्रक्रिया निम्न त्रुटि को बढ़ाने के लिए अगर मैं multiprocessing.set_executable()

Traceback (most recent call last): 
    File "start.py", line 17, in <module> 
    multiprocessing.freeze_support() 
    File "C:\Python34\Lib\multiprocessing\context.py", line 148, in freeze_support 

    freeze_support() 
    File "C:\Python34\Lib\multiprocessing\spawn.py", line 67, in freeze_support 
    main() 
NameError: name 'main' is not defined 

कॉल नहीं करते मैं अजगर 3.4 32- उपयोग कर रहा हूँ कारण है विंडोज 8.1 64 बिट पर थोड़ा चल रहा है। मैंने एक ही परिणाम के साथ सीएक्स-फ्रीज का उपयोग कर उपर्युक्त सब कुछ करने की कोशिश की है। कोई भी सहायताकाफी प्रशंसनीय होगी।

संपादित करें: जब इस उदाहरण straight out of the docs का उपयोग कर:

from multiprocessing import Process, freeze_support 

def f(): 
    print('hello world!') 

if __name__ == '__main__': 
    freeze_support() 
    Process(target=f).start() 

मैं जब बच्चा प्रक्रिया freeze_support कॉल एक ही NameError मिल()।

multiprocessing.set_executable(os.path.join(sys.exec_prefix, 'pythonw.exe')) 

भी ध्यान रखें कि आप इस किसी भी नई प्रक्रियाओं को उत्पन्न करने से पहले कॉल करने की आवश्यकता:

+0

मेरा टूल [pynsist] (http://pynsist.readthedocs.org/en/latest/) उपयोगी हो सकता है। यह आपके कोड को exe नहीं बनाता है, इसलिए आपको मल्टीप्रोसेसिंग कार्य करने के लिए किसी भी विशेष चाल की आवश्यकता नहीं है। यह एक इंस्टॉलर बनाता है जो आपके कोड के साथ ही पाइथन सेट करता है। –

+0

मैं इसे पायथन 2.7.9 और py2exe 0.6.9 का उपयोग करके काम करने में सक्षम था, बशर्ते मैंने set_executable पर कॉल हटा दिया लेकिन अभी भी freeze_support() कहा जाता है। मेरा सबसे अच्छा अनुमान यह है कि freeze_support() पायथन 3 में ठीक से काम नहीं कर रहा है। – Mobious

उत्तर

2

सुझाव दिया गया समाधान in the docs की कोशिश करो।

+0

यह मुझे वही परिणाम देता है जो मेरे पास वर्तमान में है। मैंने प्रक्रिया को शुरू करने से पहले set_executable को स्थानांतरित करने का प्रयास किया, और \ n__ name__ == '\ __ main__' के तहत कॉल करने से पहले और बाद में freeze_support(), सभी को कोई प्रभाव नहीं पड़ा। – Mobious

+1

बस ध्यान देने योग्य एक और बात: sys.exec_prefix वास्तव में पैक किए गए निष्पादन योग्य में एक खाली स्ट्रिंग है। अगर मैंने काम करने वाली निर्देशिका में python.exe को शामिल नहीं किया है, तो मुझे एक फ़ाइलNotFoundError मिलेगा क्योंकि मल्टीप्रोसेसिंग को python.exe नहीं मिल रहा है। – Mobious

+0

मुझे यह सही समस्या थी। 'Python.exe' का उपयोग करने के बजाय आपको' pythonw.exe' का उपयोग करना चाहिए जो 'अज्ञात विकल्प: --' को हल करने वाला प्रतीत होता है – Jonathan

संबंधित मुद्दे