2013-03-26 12 views
7

काम नहीं कर रहा है मैं पाइथन 3.1.4 का उपयोग कर रहा हूं जो एक अनुप्रयोग (x64) में एक स्क्रिप्टिंग पर्यावरण के रूप में एम्बेडेड है। अब तक मुझे एम्बेडेड पायथन के साथ कई सीमाएं आई हैं। मुझे नहीं पता कि यह सामान्य है या यदि आवेदन के प्रोग्रामर ने कुछ कार्यक्षमताओं को अवरुद्ध कर दिया है।एंबेडेड पायथन: मल्टीप्रोसेसिंग

उदाहरण के लिए निम्नलिखित कोड काम नहीं कर रहा:

from multiprocessing import Process 
def f(name): 
    print('hello', name) 

if __name__ == '__main__': 
    p = Process(target=f, args=('bob',)) 
    p.start() 
    p.join() 

# --> error in forking.py: 'module' object has no attribute 'argv' 
# print(sys.argv) gives the same error 

sys.executable वापसी आवेदन करने के लिए पथ।

मैं wel के रूप में इस की कोशिश की है:

multiprocessing.forking.set_executable('C:\Python31\python.exe') 
multiprocessing.set_executable('C:\Python31\python.exe') 
सफलता के बिना

क्या कोई कामकाज संभव है? यह बहुत ही असंभव है कि एप्लिकेशन के डेवलपर्स को अपने कोड में कुछ बदलने के लिए मुझे लाभ होगा।

धन्यवाद

संपादित

मैं इसे निम्नलिखित जोड़कर काम मिल गया:

sys.argv = ['c:/pathToScript/scipt.py']

मैं भी इस लाइन की जरूरत:

multiprocessing.set_executable('C:/Python31/python.exe')

अन्यथा कोड चलाने के बजाए एप्लिकेशन का एक अन्य उदाहरण खुला है।

एकमात्र समस्या जो मैंने छोड़ी है वह यह है कि मैं उन तरीकों का उपयोग नहीं कर सकता जो एप्लिकेशन को नियंत्रित करते हैं (जैसे: create_project(), add_report(), ..)। मेरा प्राथमिक लक्ष्य पूरा करने के लिए पहले व्यक्ति की प्रतीक्षा करने की आवश्यकता के बिना एकाधिक विधियों को कॉल करने में सक्षम होना था। लेकिन मुझे लगता है कि यह संभव नहीं है।

+0

क्या आप वाकई मल्टीप्रोसेसिंग के बजाय थ्रेडिंग का उपयोग करने का मतलब नहीं हैं? –

+0

कौन सा ओएस ...... ...... – NPE

+0

@ आयनुत हूलब: मुझे थ्रेडिंग के साथ-साथ जीआईएल के साथ कुछ समस्याएं भी हैं। यही कारण है कि मैंने मल्टीप्रोसेसिंग @ एनपीई के साथ प्रयास किया: विंडोज 7, 64 बिट –

उत्तर

7

डिफ़ॉल्ट रूप से, sys.argv एम्बेडेड कोड में उपलब्ध नहीं है:

Embedding Python

बुनियादी आरंभीकरण समारोह Py_Initialize() है। यह लोड किए गए मॉड्यूल की तालिका प्रारंभ करता है, और मूल मॉड्यूल बिल्टिन, __main__, और sys बनाता है। यह मॉड्यूल खोज पथ (sys.path) भी शुरू करता है।

Py_Initialize() "स्क्रिप्ट तर्क सूची" (sys.argv) सेट नहीं करता है। यदि इस चर अजगर कोड है कि बाद में, यह

विंडोज़ पर Py_Initialize करने के लिए कॉल के बाद PySys_SetArgvEx के लिए एक कॉल (argc, argv, updatepath)() के साथ स्पष्ट रूप से सेट किया जाना चाहिए निष्पादित किया जाएगा द्वारा की जरूरत है, multiprocessing स्क्रैच से नई प्रक्रियाओं को जन्म देना चाहिए। यह बाल प्रक्रियाओं को अलग करने के लिए कमांड लाइन स्विच --multiprocessing-fork का उपयोग करता है, और मूल argv को माता-पिता से बच्चे तक भी प्रेषित करता है।

उपप्रोसेसेस बनाने से पहले sys.argv = ['c:/pathToScript/scipt.py'] असाइन करना, जैसा कि आपने पाया, एक अच्छा कामकाज प्रतीत होता है।

सेट जब एक बच्चे प्रक्रिया शुरू करने का उपयोग करने के अजगर दुभाषिया की राह:

प्रलेखन का एक दूसरा प्रासंगिक टुकड़ा है कि multiprocessing.set_executable() की है। (डिफ़ॉल्ट रूप से sys.executable का उपयोग किया जाता है)। Embedders शायद

set_executable(os.path.join(sys.exec_prefix, 'pythonw.exe'))
इससे पहले कि वे बच्चे प्रक्रियाओं बना सकते हैं जैसे कुछ बात करने की आवश्यकता होगी। (केवल विंडोज़)

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