2015-09-11 9 views
11

पर कॉल करने वाले साइथन पैकेज बनाने के लिए setuptools का उपयोग करके मैं संकुल को संकलित, स्थापित और चलाने का प्रयास कर रहा हूं जिसे हम myPackage पर कॉल करेंगे। इसमें *.pyx फ़ाइल है जो लाइब्रेरी fftw से फ़ंक्शन fftw_set_timelimit() को कॉल करती है। वर्तमान में, जब मैं एक स्क्रिप्ट clientScript.py कि पैकेज मैं निम्न त्रुटि संदेश प्राप्त आयात चलाएँ:बाहरी सी लाइब्रेरी

Traceback (most recent call last): 
    File "clientScript.py", line 5, in <module> 
    import myPackage.myModule 
ImportError: /usr/local/lib/python2.7/dist-packages/myPackage/myModule.so: undefined symbol: fftw_set_timelimit 

मैं क्या समझ से (मैं काफी अजगर और cython लिए नया हूँ), सी पुस्तकालय के साथ जोड़ने के लिए अभी तक नहीं है मेरे पैकेज में प्रदर्शन किया। दरअसल, मेरी setup.py फ़ाइल इस तरह दिखता है:

from setuptools import setup,find_packages 
from Cython.Build import cythonize 
import os 

setup(
    name = "myPackage", 
    version = "0.0.1", 
    url = "none", 
    author = "me", 
    author_email = "[email protected]", 
    packages=find_packages(), 
    ext_modules = cythonize("pyClo/pyClo.pyx"), 
) 

आप देख सकते हैं मेरी setup.py फ़ाइल setuptools उपयोग करता है। मैंने ऐसा करने का फैसला किया क्योंकि इसकी सिफारिश Python Packaging User Guide द्वारा की जाती है। हालांकि, Cython documentation में दिए गए निर्देशों के बजाय distutils का उपयोग करें। लाइब्रेरी को लिंक करना distutils.Extension('file',['file.pyx'],libraries='fftw') पर कॉल के माध्यम से किया जाता है। setuptools का उपयोग करके मैं एक ही परिणाम कैसे प्राप्त करूं?

उत्तर

13

यह पता चला है कि setuptools में एक मॉड्यूल setuptools.extension.Extension है जिसका उपयोग distutils.extension.Extension मॉड्यूल के समान होता है। यहाँ

from setuptools import setup, find_packages 
from setuptools.extension import Extension 
from Cython.Build import cythonize 

extensions = [ 
    Extension(
     "myPackage.myModule", 
     ["myPackage/myModule.pyx"], 
     include_dirs=['/some/path/to/include/'], # not needed for fftw unless it is installed in an unusual place 
     libraries=['fftw3', 'fftw3f', 'fftw3l', 'fftw3_threads', 'fftw3f_threads', 'fftw3l_threads'], 
     library_dirs=['/some/path/to/include/'], # not needed for fftw unless it is installed in an unusual place 
    ), 
] 

setup(
    name = "myPackage", 
    packages = find_packages(), 
    ext_modules = cythonize(extensions) 
) 

मेरी स्थापना निर्देशिका का एक सिंहावलोकन है:

अंत में, setup.py फ़ाइल तरह दिखता है

. 
├── MANIFEST.in 
├── myPackage 
│   └── myModule.pyx 
├── README.rst 
└── setup.py 

जहां myModule.pyx फ़ाइल कि fftw_set_timelimit() कॉल है।

MANIFEST.in शामिल हैं:

include myPackage/*.* 

और README.rst एक मात्र सादा पाठ फ़ाइल है।

+1

[distutils दस्तावेज़ीकरण] के अनुसार (https://docs.python.org/2/distutils/apiref.html#distutils.core.Extension), 'distutils.core.Extension' पहले तर्क के रूप में लेता है: "_ एक्सटेंशन का पूरा नाम, जिसमें कोई भी पैकेज शामिल है - यानी फ़ाइल नाम या पथनाम नहीं, लेकिन पायथन डॉट नाम_" इसलिए, "myPackage/myModule" 'के बजाय, किसी के पास" myPackage.myModule "होना चाहिए। – SylM

+0

@SylM मैं थोड़ी देर में अजगर का उपयोग नहीं कर रहा हूं ... तो यह मेरे लिए दोबारा जांच करने के लिए कुछ प्रयास होने जा रहा है कि स्लैश को "/" एक बिंदु से बदलना "।" जैसा कि आप सुझाव दे रहे हैं वास्तव में काम करता है। हालांकि अगर आप समाधान का परीक्षण करते हैं और मुझे बताते हैं कि यह ठीक है, तो मैं तदनुसार अपना जवाब संपादित करूंगा। "समाधान का परीक्षण" करके मेरा मतलब है कि स्क्रैच से एक नई परियोजना शुरू करना और सुनिश्चित करना कि आप इसे काम कर सकते हैं। क्या आप ऐसा करना चाहते हैं? ;) –

+0

@GLorieul मैंने बिंदीदार नाम वाक्यविन्यास का उपयोग करके उपर्युक्त टेम्पलेट का उपयोग किया है, और सफलतापूर्वक संकलित किया है। – Gilly

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