मूल रूप से मैं 3 फ़ोल्डर:
CPROJECT
, सी ++ पुस्तकालय: एक libcproject.so
साझा वस्तु
CYPROJECT
, cythonized अजगर विस्तार उत्पादन: cyproject.so
Cython
DEPENDENCIES
का उपयोग कर उत्पादन, निर्भरता: जहां मैं दोनों परियोजनाओं के लिए बाहरी आवश्यकताओं की प्रतिलिपि बनाता हूं
1. में मैं सी ++ विस्तार का निर्माण (जीसीसी के साथ संकलित - -shared
, -fPIC
संकलन विकल्प) कि अजगर को और CYPROJECT
पायथन के लिए सुविधाओं का पर्दाफाश करने पर निर्भर करता है कि सामने आ जाएगी। पोस्ट प्रोसेसिंग कमांड के रूप में, परिणामस्वरूप .so
को DEPENDENCIES/libcproject/
(साथ ही include
फ़ाइलों) में कॉपी किया गया है। इस तरह लाइब्रेरी निश्चित रूप से शुद्ध सी ++ प्रोजेक्ट में स्वतंत्र रूप से प्रयोग योग्य है।
तो क्या setup
उप फ़ोल्डर में है ?(मुख्य रूप से प्रदर्शित करने के लिए अतिरिक्त adapters
कैसे संकलित किए जाते हैं) setup.py
का एक उदाहरण
export PYTHONPATH=$PYTHONPATH:../../../DEPENDENCIES/Cython-0.18
export PATH=$PATH:../../../DEPENDENCIES/libcproject:../../../DEPENDENCIES/Cython-0.18/bin
# Note the `../../../DEPENDENCIES/libcproject`...
CC="gcc" \
CXX="g++" \
python setup.py build_ext --inplace
और यहाँ:
import sys
import os
import shutil
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
# Cleaning
for root, dirs, files in os.walk(".", topdown=False):
for name in files:
if (name.startswith("cyproject") and not(name.endswith(".pyx"))):
os.remove(os.path.join(root, name))
for name in dirs:
if (name == "build"):
shutil.rmtree(name)
# Building
setup(
cmdclass = {'build_ext': build_ext},
ext_modules = [
Extension("cyproject",
sources=["cyproject.pyx", \
"adapter/ALabSimulatorBase.cpp", \
"adapter/ALabSimulatorTime.cpp", \
"adapter/ALabNetBinding.cpp", \
"adapter/AValueArg.cpp", \
"adapter/ALabSiteSetsManager.cpp", \
"adapter/ALabSite.cpp", \
],
libraries=["cproject"],
language="c++",
extra_compile_args=["-I../inc", "-I../../../DEPENDENCIES/python2.7/inc", "-I../../../DEPENDENCIES/gsl-1.8/include"],
extra_link_args=["-L../lib"]
extra_compile_args=["-fopenmp", "-O3"],
extra_link_args=[]
)
]
)
और अंत में, मुख्य .pyx
यहाँ setup.sh
के लिए एक नमूना कोड है , जो सिथॉन भाग के साथ .pyx
एस लिखा है [cyproject.pyx
]:
include "pyext/Utils.pyx"
include "pyext/TCLAP.pyx"
include "pyext/LabSimulatorBase.pyx"
include "pyext/LabBinding.pyx"
include "pyext/LabSimulatorTime.pyx"
...
नोट: सभी Cython द्वारा उत्पन्न फ़ाइलें इस setup
फ़ोल्डर में रहता है, ठीक है, हाथ से लिखा सामान (adapters
और pyext
) से अलग कर के रूप में उम्मीद।
3. एक अलग DEPENDENCIES
फ़ोल्डर का उपयोग करने में चीजें अच्छी तरह से अलग (- और उसके निर्भरता - कुछ अन्य वातावरण में मामले में मैं कदम होगा CYPROJECT
) रखने के लिए अनुमति देता है।
यह सब आपको एक सिंहावलोकन देने के लिए (एक प्रासंगिक, मुझे आशा है) कि इस तरह के प्रोजेक्ट को व्यवस्थित कैसे किया जा सकता है।
क्या आपकी सी ++ परियोजना पाइथन के बिना उपयोग की जा सकती है? क्या समानांतर ctypes, cffi -based bindings (विभिन्न ट्रेडों के साथ अधिक लक्ष्य का समर्थन करने के लिए) बनाने के लिए यह समझ में आता है जो एक ही पायथन इंटरफ़ेस प्रदान करता है? – jfs
@ जेएफ। सेबेस्टियन परियोजना पाइथन (अब के लिए) के बिना इस्तेमाल और उपयोग की जानी चाहिए। मैं आपका दूसरा प्रश्न नहीं समझता। – clstaudt
फिर तर्कसंगत रूप से आपके पास दो परियोजनाएं हैं: libproject (सी ++ लाइब्रेरी) और पायप्रोजेक्ट (पायथन मॉड्यूल जो पाइथन से libproject का उपयोग करने की अनुमति देता है)। दृढ़ता के लिए (स्रोतों और सह-विकास से स्थापित करना आसान) में आप पाइप्रोजेक्ट के अंदर libproject शामिल हो सकते हैं। दूसरे प्रश्न पर: कई पायथन संस्करणों पर तैनाती के लिए ctypes- आधारित बाइंडिंग आसान हो सकती है। बेहतर पिपी समर्थन के लिए सीएफआई-आधारित बाइंडिंग का उपयोग किया जा सकता है। उदाहरण के लिए, 'pyinotify' दोनों में ctypes- आधारित है और सी में लिखा गया मूल एक्सटेंशन,' pyzmq' में दोनों सीएफआई और साइथन आधारित कार्यान्वयन हैं। चाहे आपको इसकी आवश्यकता हो, आपकी परियोजना पर निर्भर करता है। – jfs