2009-05-15 5 views
5

के साथ py2app का उपयोग करने में समस्या मैं कुछ पायथन स्क्रिप्ट से एक स्टैंडअलोन एप्लिकेशन उत्पन्न करने के लिए 'py2app' का उपयोग करने की कोशिश कर रहा हूं। पायथन 'lxml' पैकेज का उपयोग करता है, और मुझे पता चला है कि मुझे इसे स्पष्ट रूप से setup.py फ़ाइल में निर्दिष्ट करना है जो 'py2app' उपयोग करता है। हालांकि, परिणामस्वरूप एप्लिकेशन प्रोग्राम अभी भी उन मशीनों पर नहीं चलेगा जिनके पास 'lxml' स्थापित नहीं है।lxml पैकेज

मेरे Setup.py इस तरह दिखता है:

MyApp Error 
An unexpected error has occurred during execution of the main script 
ImportError: dlopen(/Users/ake/XXXX/XXXX/MyApp.app/Contents/Resources/lib/python2.5/lxml/etree.so, 2): Symbol not found: _xmlSchematronParse 
Referenced from: /Users/ake/XXXX/XXXX/MyApp.app/Contents/Resources/lib/python2.5/lxml/etree.so 
Expected in: dynamic lookup 

'libxml2' है कि कहा जाता है प्रतीक '_xmlSchematronParse' है एक पुस्तकालय से 'lxml:

from setuptools import setup 

OPTIONS = {'argv_emulation': True, 'packages' : ['lxml']} 

setup(app=[MyApp.py], 
     data_files=[], 
     options={'py2app' : OPTIONS}, 
     setup_requires=['py2app']) 

आवेदन चल रहा है निम्नलिखित उत्पादन का उत्पादन ' निर्भर करता है। मैक ओएस एक्स के साथ प्रीइंस्टॉल किया गया संस्करण 'lxml' के लिए पर्याप्त नहीं है, इसलिए मुझे संस्करण 2.7.2 (/ usr/local) में स्थापित करना पड़ा। py2app, किसी कारण से, संस्करण में /Developer/SDKs/MacOSX10.3.9.sdk/usr/lib में लिंक कर रहा है। जब मैं पाइथन लिपि के रूप में अपना आवेदन चलाता हूं, तो सही संस्करण मिलता है। (मैंने अभी 2.7.2 संस्करण छुपाकर इसे चेक किया है।)

तो मेरा सवाल अब है, मैं पुस्तकालयों को देखने के लिए py2app कैसे कह सकता हूं?

+1

क्या आपको अपने ऐप की सामग्री/फ्रेमवर्क उपदिर में libxml2.2.dylib मिलती है? –

+0

हां, यह वहां है। –

उत्तर

10

इसे मिला। py2app में 'फ्रेमवर्क' विकल्प है जो आपको ढांचे, और डाइलीब निर्दिष्ट करने देता है। मेरी setup.py फ़ाइल अब इस तरह दिखती है:

from setuptools import setup 

DATA_FILES = [] 
OPTIONS = {'argv_emulation': True, 
      'packages' : ['lxml'], 
      'frameworks' : ['/usr/local/libxml2-2.7.2/lib/libxml2.2.7.2.dylib'] 
      } 

setup(app=MyApp.py, 
     data_files=DATA_FILES, 
     options={'py2app' : OPTIONS}, 
     setup_requires=['py2app']) 

और यह ठीक है।

उन सुझावों के लिए धन्यवाद जो मुझे यहां ले गए।

+1

मैक ओएस एक्स पर, libxml '/usr/lib/libxml2.2 में स्थित है।dylib 'किसी को आश्चर्यचकित करना – Patrick

+0

@ पैट्रिक जो सिस्टम है, यदि आप किसी अन्य वितरण (जैसे होमब्रू) के खिलाफ' py2app' बनाते हैं, तो उस वितरण से पैकेज करना सुरक्षित है। – dashesy

1

------------- संपादित --------------
libxml2 अजगर की python.org संस्करण में मानक है। यह पाइथन के ऐप्पल के संस्करण में मानक नहीं है। सुनिश्चित करें कि py2app पाइथन के सही संस्करण का उपयोग कर रहा है, या अपने मैक पर libxml2 और libxslt इंस्टॉल करें।

+1

libxml2 एक पायथन पैकेज नहीं है लेकिन एक साझा लाइब्रेरी है। –

+0

libxml2 ऐप्पल के पायथन डिस्ट्रो में शामिल नहीं है। –

+0

मैंने कोशिश की लेकिन, जैसा कि लूपर बताता है, यह पैकेज नहीं है। –

1

मुझे विशेष रूप से lxml और py2app के संयोजन के साथ कोई अनुभव नहीं है, लेकिन मुझे py2app के साथ समस्याएं हैं जो मॉड्यूल नहीं उठा रहे हैं जिन्हें स्पष्ट रूप से आयात नहीं किया गया था।

OPTIONS['includes'] = [filename[:-3].replace('/', '.') for filename \ 
    in glob.glob('path/to/*.py')] 

शायद यह भी अपने कोड में कहीं न कहीं एक स्पष्ट from lxml import etree डालने के लिए अपने मामले में मदद करता है: उदाहरण के लिए, मैं स्पष्ट रूप से मॉड्यूल __import__() के माध्यम से आयात किया जाता है कि, इस तरह शामिल करने के लिए था?

1

मैंने अभी तक अपने ऐप की कोशिश की है (एक समान सेटअप के साथ py2app और lxml का उपयोग करता है) विकास पुस्तकालयों के बिना किसी अन्य मैक पर स्थापित है, और यह काम करता है, इसलिए आपके सिस्टम में कुछ गड़बड़ होनी चाहिए। मेरा अनुमान है कि py2app libxml2 का गलत संस्करण चुनता है (मुझे लगता है कि यह आईफोन एसडीके के साथ बंडल किया गया है उदाहरण के लिए, जो शायद आप चाहते हैं संस्करण नहीं है)।

खान, पूरे पायथन टूलचेन के रूप में, मैकपोर्ट्स से आता है, नवीनतम libxml2.2.dylib का md5 योग (मेरे .app में समाप्त होने वाला एक) 863c7208b6c34f116a2925444933c22a है जो मेरे सिस्टम पर है।