python - सीएक्स-फ्रीज, रनपी और मल्टीप्रोसेसिंग-विफलता के लिए कई पथ




ubuntu multiprocessing (2)

मुझे पता है कि शायद यह वह नहीं है जिसे आप सुनना चाहते हैं, लेकिन वास्तविकता यह है कि आप कभी भी इस दृष्टिकोण के साथ सफल नहीं हो पाएंगे और यही कारण है कि:

  • लिनक्स में पोर्टेबल पैकेज बाइनरी नहीं हैं, जिसका अर्थ है कि एक डिस्ट्रो पर एक संकलित numpy शायद दूसरे पर काम नहीं करेगा। यह एक ही वितरण और संस्करण के साथ भी हो सकता है, सिर्फ इसलिए कि एक सिस्टम लाइब्रेरी को एक अद्यतन प्राप्त हुआ।
  • manylinux1 को हल करना है, लेकिन इसके लिए पैकेज बनाना वास्तव में कठिन है और केवल कुछ ही इसका उपयोग करना शुरू कर दिया है।
  • सीएक्स-फ्रीज प्रोजेक्ट में दिसंबर 2014 में नवीनतम रिलीज हुई थी, जो पाइथन टाइमकेल पर इसे एक त्याग किए गए प्रोजेक्ट के रूप में रखती है।

यह एक जटिल व्यक्ति है, और आपका कुछ समय ले सकता है।

मूल समस्या यह है कि लिनक्स (मेरे परीक्षण मामले में उबंटू) पर मेरे प्रोग्राम (ओमनीटूल) का एक सीएक्स-फ्रीजेड संस्करण उपप्रोसेस बनाने में सक्षम नहीं है। यह विंडोज 7 पर काम करता है, हालांकि। या सीधे स्रोत कोड से चलते समय। दुर्भाग्य से यह freeze_support भूलने जितना आसान नहीं है।

समस्या

उपप्रोसेस शुरू करने का डिफ़ॉल्ट व्यवहार यह है कि एक्स सर्वर क्रैश हो जाता है। विशेष रूप से इस तरह:

XIO:  fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
      after 23 requests (23 known processed) with 0 events remaining.
[xcb]Unknown sequence number while processing queue 
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called 
[xcb] Aborting, sorry about that. 
Omnitool: ../../src/xcb_io.c:274: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed. 
Aborted (core dumped)

कोई अजगर ट्रेसबैक नहीं है। मैंने ctypes के साथ XInitThreads को मैन्युअल रूप से कॉल करने का प्रयास किया, यह सफलतापूर्वक सेट करने के लिए 0 लौटाता है, लेकिन परवाह किए बिना दुर्घटनाग्रस्त हो जाता है। दुर्घटना से पहले शॉर्ट, पाइगेम यूआई बग आउट, इसलिए मुझे उम्मीद है कि कुछ गड़बड़ है।

अब, multiprocessing.set_start_method() सेटिंग को चारों ओर समस्याएं बदलती हैं: "फोर्कर्वर" मुझे यह प्यारा ट्रेसबैक देता है, जो मुझे कुछ भी नहीं बताता है:

पेस्टबिन उदाहरण

इसे स्पॉन करने के लिए सेट करना, इसके बजाए, यह कुछ भी नहीं करता है। प्रक्रिया शुरू होती है, और __main__ माध्यम से __main__ , क्योंकि मैं प्रिंट के साथ साबित कर सकता हूं, लेकिन __main__ लिए लक्ष्य फ़ंक्शन में प्रवेश नहीं करता हूं।

खुद को कोशिश कर रहा हूँ

सुनिश्चित करें कि आपके पास पाइथन 3.4 के साथ उबंटू या तुलनीय लिनक्स है। फिर सभी निर्भरताओं को प्राप्त करने के लिए:

गिट से ज़िप या क्लोन के रूप में omnitool डाउनलोड करें: निम्न कोड में https://github.com/Berserker66/omnitool requirements.txt Omnitool से है।

sudo apt-get update -qq
sudo apt-get install --fix-missing mercurial subversion python3-dev python3-numpy libav-tools libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev libsmpeg-dev libsdl1.2-dev libportmidi-dev libswscale-dev libavformat-dev libavcodec-dev python3-pip
pip3 install -r requirements.txt
pip3 install cx_Freeze

जमा करने के लिए, build तर्क के साथ omnisetup.py चलाएं।

मैंने pyinstallers पायथन 3 कांटा के साथ ठंड करने का भी प्रयास किया है, जो बहुत समान विफल रहता है। हालांकि spec फ़ाइल गिट ट्रैक नहीं है।


मैंने काम पर एक परियोजना के लिए cx_freeze का इस्तेमाल किया। मुझे यकीन नहीं है कि यह आपकी समस्या है ... लेकिन मैं एनाकोंडा वितरण का उपयोग कर रहा था, और cx_freeze ठीक से उस डीडीएल को एकत्र नहीं कर रहा था जिसे मुझे अपनी परियोजना के लिए जरूरी था।

समाधान था:

  1. पायथन के एक विमान संस्करण स्थापित करें
  2. उस परियोजना के लिए मुझे आवश्यक पैकेजों के साथ वातावरण बनाएं
  3. Cx_freeze चलाएं।

जादुई रूप से, सभी समस्याएं चली गईं और सबकुछ संकलित किया गया था।





cx-freeze