2015-07-13 4 views
18

मैं सीटीपी के साथ सी पुस्तकालय का उपयोग कर एक अजगर पैकेज बना रहा हूं। मैं अपना पैकेज पोर्टेबल (विंडोज़, मैक और लिनक्स) बनाना चाहता हूं।मेरे पायथन पैकेज के साथ सी लाइब्रेरी के निर्माण से कैसे बचें?

मुझे build_ext का उपयोग करके pip के साथ मेरे पैकेज की स्थापना के दौरान लाइब्रेरी बनाने के लिए एक रणनीति मिली। यह लक्ष्य के प्लेटफार्म के आधार पर libfoo.dll या libfoo.dylib या libfoo.so बनाता है।

समस्या यह है कि मेरे उपयोगकर्ता को सीएमके स्थापित करने की आवश्यकता है।

स्थापना के दौरान इमारत से बचने के लिए एक और रणनीति मौजूद है? क्या मुझे अपने पैकेज में निर्मित पुस्तकालयों को बंडल करना है?

मैं अपने उपयोगकर्ताओं को pip install mylib कराना चाहता हूं।

संपादित: टिप्पणी @Dawid लिए धन्यवाद, मैं किसी भी सफलता के बिना आदेश python setup.py bdist_wheel के साथ एक python wheel बनाने की कोशिश कर रहा हूँ।

मैं एम्बेडेड लाइब्रेरी के साथ विभिन्न प्लेटफ़ॉर्म के लिए अपना पायथन व्हील कैसे बना सकता हूं?

संपादित करें 2: मैं अजगर 3.4 और मैक ओएस एक्स पर काम कर उपयोग कर रहा हूँ, लेकिन मैं Windows कंप्यूटर और लिनक्स कंप्यूटर

+0

हां, आपको विशिष्ट प्लेटफ़ॉर्म, 'पाइप इंस्टॉल व्हील' के लिए व्हील पैकेज (बाइनरी संकलित) बनाने की आवश्यकता है और फिर आवश्यक प्लेटफार्मों के लिए निर्माण – Dawid

+0

@ डेविड धन्यवाद, मैंने एक अजगर पहिया बनाने की कोशिश की, लेकिन मुझे लगता है कि मैं हूं कुछ याद आ रहा है –

+0

मुझे लगता है कि आपको उस lib के बारे में जानकारी 'setup.py' में शामिल करने की आवश्यकता है, इसलिए यह इसे बनाएगा। प्रत्येक प्लेटफॉर्म पर 'python setup.py bdist_wheel' निष्पादित करने के तरीके https://docs.python.org/3.4/extending/building.html के साथ कुछ संकलित लाइब्रेरी के साथ उस प्लेटफॉर्म के लिए whl पैकेज बना देगा। फिर लिनक्स पर उपयोगकर्ता मैक के लिए मैक पर विंडोज़ के लिए विंडोज़ पर लिनक्स के लिए पैकेज स्थापित करेंगे। कम से कम मैं उन प्रणालियों के लिए बाइनरी पैकेज बनाने के लिए क्या करूंगा। – Dawid

उत्तर

8

आप निश्चित रूप से मेरे शोध के अनुसार सही रास्ते का नेतृत्व कर रहे हैं ... जैसा कि डैनियल कहते हैं, आपके पास एकमात्र विकल्प है जो बाइनरी को स्वयं बनाना और वितरित करना है।

सामान्य रूप से, पैकेज स्थापित करने के लिए अनुशंसित तरीका packaging user guide में अच्छी तरह से कवर किया गया है। मैं वहां सलाह दोहराऊंगा क्योंकि आपने स्पष्ट रूप से इसे पहले से ही पाया है। हालांकि वहां महत्वपूर्ण बात यह है कि पायथन समुदाय, विशेष रूप से PyPA बाइनरी एक्सटेंशन पैकेज करने के लिए platform wheels का उपयोग करने पर मानकीकृत करने की कोशिश कर रहा है। अफसोस की बात है कि इस बिंदु पर कुछ मुद्दे हैं:

  1. आप सभी लिनक्स वेरिएंट के लिए वितरण नहीं बना सकते हैं, लेकिन आप एक संगत सबसेट के लिए पहियों का निर्माण कर सकते हैं। विवरण के लिए https://www.python.org/dev/peps/pep-0513/ देखें।
  2. advice on building extensions कुछ हद तक अधूरा है, जो बाइनरी वितरण के लिए एक पूर्ण समाधान की कमी को दर्शाता है।
  3. लोग अपनी खुद की लाइब्रेरी बनाने और इसे डेटा फ़ाइल के रूप में वितरित करने का प्रयास करते हैं, जो setuptools को भ्रमित करता है।

मुझे लगता है कि आप इस अंतिम मुद्दे को मार रहे हैं। एक workaround वितरण को बलपूर्वक मजबूर करने के लिए is_pure() को ओवरराइड करके प्लेटफ़ॉर्म व्हील बनाने के लिए मजबूर करना है। हालांकि आप केवल अपने मूल निर्माण निर्देशों को रख सकते हैं और bdist_wheel इसे संभाल लेना चाहिए।

एक बार जब आप पहिया बना लेंगे, फिर भी, आपको अभी भी इसे वितरित करने की आवश्यकता है और शायद अन्य बाइनरी पैकेज जो इसका उपयोग करते हैं या इसका उपयोग करते हैं।इस बिंदु पर, आपको अपने पहियों की सेवा के लिए recommended tools कोंडा या पीईपीआई प्रॉक्सी जैसे devpi जैसे किसी एक का उपयोग करने की आवश्यकता है।

संपादित करें: पार संकलन

कवर here अजगर 2.6 के रूप में के बारे में अतिरिक्त प्रश्न का उत्तर देने और बाद में 32/64-बिट बनाता है विंडोज के लिए पार संकलन अनुमति देता है। अन्य प्लेटफॉर्म पर अन्य पैकेजों के लिए कोई औपचारिक समर्थन नहीं है और लोगों को limited success ऐसा करने का प्रयास कर रहा है। आप अपने प्रत्येक लिनक्स/मैक/विंडोज वातावरण पर मूल रूप से निर्माण करने से वाकई सबसे अच्छे हैं।

+2

"आप पीईपीआई में लिनक्स व्हील अपलोड नहीं कर सकते" क्यों नहीं? – endolith

+0

[पायथन पैकेजिंग अथॉरिटी] के अनुसार (https://python-packaging-user-guide.readthedocs.io/distributing/#platform-wheels): "वर्तमान में, व्हील टैग विनिर्देश (पीईपी 425) भिन्नता को संभाल नहीं करता है जो लिनक्स डिस्ट्रोज़ में मौजूद हो सकता है। " –

+0

अब और नहीं: लिनक्स व्हील अब पीईपीआई पर समर्थित हैं। तदनुसार जवाब अपडेट किया गया। –

0

की पहुंच है आप उपयोगकर्ता स्थापना के दौरान निर्माण करने के लिए नहीं करना चाहते हैं , आपको एक पूर्व-निर्मित बाइनरी पैकेज प्रदान करना होगा, मुझे नहीं लगता कि कोई अन्य रणनीति संभव है। मैंने py2exe के बारे में अच्छी बातें सुनी हैं, लेकिन मैं विंडोज़ का उपयोग नहीं करता हूं इसलिए आईडीके। मुझे miniconda के साथ अच्छे अनुभव हुए हैं, लेकिन इसे build binary packages from pypi पर थोड़ा अतिरिक्त काम करने की आवश्यकता है।

+0

धन्यवाद, लेकिन मैं अपने उपयोगकर्ता को साइगविन/mingw32 या cmake इंस्टॉल करना पसंद करता हूं और इसके लिए एक इंस्टॉलर बनाने के बजाय 'पाइप इंस्टॉल mylib' करता हूं। मैं बस फ्यूचर जाना चाहता हूं और सेमेक इंस्टॉलेशन से बचने की कोशिश करता हूं। –

1

मैं अपने उपयोगकर्ता स्थापित करने के लिए cygwin/mingw32 या cmake पसंद करते हैं और एक pip install mylib कर [...]। मैं बस आगे जाना चाहता हूं और को सीएमके इंस्टॉलेशन से बचने की कोशिश करता हूं।

प्री-संकलित पायथन मॉड्यूल पैकेजिंग के रूप में, @ पीटर ब्रितन का पूरा उत्तर देखें।

अब यह मानते हुए कि उपयोगकर्ता वास्तव में एक सी कंपाइलर स्थापित है (चाहे साइगविन, विंडोज पर कोंडा, या सिस्टम लिनक्स पर सिस्टम), और आप चाहते हैं कि सीएमके इंस्टॉलेशन से बचें, जिसका कोई संबंध नहीं है पायथन पैकेजिंग ।

सवाल तो CMake का कितना कार्यक्षमता का उपयोग कर रहे हैं और क्या एक ही बात विकल्प का प्रबंधन करने के लिए आसान के साथ पूरा किया जा सकता है, से संबंधित प्रश्नों के (1), (2) देखते हैं, आदि

संपादित है: विशेष रूप से, मैं SCons है कि एक पूर्ण निर्माण प्रणाली प्रदान करता है, की तर्ज पर कुछ सोच रहा था, लेकिन अजगर में लिखा तो यह CMake की तुलना में एक अजगर के अनुकूल वातावरण में स्थापित करने के लिए आसान है, full comparison here देखते हैं। एक जंगली अनुमान (मैं इसे अपने आप इस्तेमाल नहीं किया है), लेकिन क्योंकि यह एक शुद्ध अजगर मॉड्यूल है, तो आप शायद SCons एक निर्भरता के रूप में अपने setup.py में सेट कर सकते हैं, और पूरी तरह से अपने सी कोड वहाँ के निर्माण को स्वचालित, ताकि pip install mylib सब कुछ है कि नहीं करता है जरूरत है। यह भी देखें, CMake2SCons पैकेज जो उपयोगी हो सकता है।

+1

अभी के लिए मैंने कई जरूरतों को हैकिंग एक्सटेंशन() को उनकी जरूरतों को पूरा करने, संकलक का पता लगाने और संकलक पैरामीटर को संशोधित करने के लिए देखा है। केमेक मेरे लिए इस जटिलता को संभालता है। मैंने कुछ libs (.dll और .dylib) को विभिन्न प्लेटफ़ॉर्म पर काम किया है। मैं तैनाती के लिए एक समाधान खोजने की कोशिश कर रहा हूं लेकिन मेरे उपयोगकर्ता को स्थापित करने के लिए भी आसान है। –

3

@rth और @PeterBrittain मुझे बहुत मदद करते हैं। यहाँ समाधान मैं का उपयोग करें:

संरचना फ़ोल्डर:

setup.py 
python_package/ 
    lib/ 
     libfoo.dylib 
     libfoo.dll 
    __init__.py 
    main.py 

setup.py:

from setuptools import setup, dist 


class BinaryDistribution(dist.Distribution): 
    def is_pure(self): 
     return False 


setup(
    name='python_package', 
    package_data={'python_package': ['lib/libfoo.dylib','lib/libfoo.dll']}, 
    include_package_data=True, 
    distclass=BinaryDistribution, 
    packages=['python_package'], 
) 

main.py:

#!/usr/bin/env python 
import platform 
from ctypes import CDLL, c_char_p 

import pkg_resources 

sysname = platform.system() 

if sysname == 'Darwin': 
    lib_name = "libfoo.dylib" 
elif sysname == 'Windows': 
    lib_name = "libfoo.dll" 
else: 
    lib_name = "libfoo.so" 
lib_path = pkg_resources.resource_filename('python_package', 'lib/{}'.format(lib_name)) 
foo = CDLL(lib_path) 

bar = foo.bar 
bar.restype = c_char_p 
bar.argtypes = [c_char_p] 

print(bar('hello')) 

निर्माण पहिया:

python setup.py bdist_wheel 

यह एक विशिष्ट plateform पहिया rtfdoc-0.0.1-cp34-cp34m-macosx_10_10_x86_64.whl बनाता है और मैक उपयोगकर्ताओं के लिए एक सरल pip install rtfdoc-0.0.1-cp34-cp34m-macosx_10_10_x86_64.whl

क्या कर सकते हैं यह समाधान पूरी तरह से संतोषजनक नहीं है:

  • मुझे लगता है कि मैं अभी भी एक Extension बना सकते हैं या के लिए SCons को देखने के लिए की आवश्यकता होगी लिनक्स उपयोगकर्ता।
  • अद्यतन अपने पैकेज lib के उत्पादन की वजह से मुश्किल होगा
  • मैं कैसे 32 बिट और 64 बिट के लिए .dll प्रबंधन करने के लिए

धन्यवाद, मैं बहुत कुछ सीखा पता नहीं है, और मैं समझता हूं कि क्यों pillill या Psycopg2 में setup.py

2

आप ट्रेविस सीआई और/या सभी प्रकार के प्लेटफ़ॉर्म और पायथन संस्करणों के लिए ट्रैविस सीआई और/या एपवेयर पर पहियों का निर्माण करने के लिए cibuildwheel का उपयोग कर सकते हैं। यह टूल आपके पहियों को पीईपीआई या अन्य जगहों पर भी तैनात कर सकता है।

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