2015-09-11 15 views
11

myPackage numaralı telefonu arayacağımız bir paketi derlemeye, yüklemeye ve çalıştırmaya çalışıyorum. fftw_set_timelimit() işlevini fftw kitaplığından çağıran bir *.pyx dosyasını içerir. Ben aşağıdaki hata iletisini elde paketi ithal bir komut dosyası clientScript.py çalıştırdığınızda Halen: Anladığım kadarıylaHarici C kitaplığı çağıran bir cython paketi oluşturmak için setuptools'u kullanma

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 

(Python ve Cython oldukça yeniyim), C kütüphanesi ile bağlantı henüz paketimde gerçekleştirildi. Nitekim, benim setup.py dosya şuna benzer:

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"), 
) 

sen benim setup.py dosya setuptools kullanır görebileceğiniz gibi. Python Packaging User Guide tarafından önerildiği için yapmaya karar verdim. Ancak, Cython documentation'daki yönergeler, bunun yerine distutils kullanır. Kütüphaneleri bağlama, distutils.Extension('file',['file.pyx'],libraries='fftw') numaralı telefondan yapılır. setuptools'u kullanarak aynı sonucu nasıl elde ederim?

cevap

13

setuptools, modülüyle aynı şekilde kullanılan bir setuptools.extension.Extension modülüne sahiptir. İşte

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) 
) 

benim kurulum dizininin bir bakış: Sonunda

, setup.py dosya gibi görünür myModule.pyxfftw_set_timelimit() çağıran dosyadır

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

.

MANIFEST.in içerir:

include myPackage/*.* 

ve README.rst sadece düz metin dosyasıdır. : [distutils belgeler] (https://docs.python.org/2/distutils/apiref.html#distutils.core.Extension), `distutils.core.Extension` bir birinci değişken olarak alır göre

+1

msgstr "" "herhangi bir paket de dahil olmak üzere uzantının tam adı - bir dosya adı veya yol adı değil, Python noktalı adı_" Bu nedenle, "myPackage/myModule" yerine, "myPackage.myModule" olmalıdır. – SylM

+0

@SylM Python'u bir süredir kullanmıyorum… Bu yüzden "/" işaretinin yerini "/" ile değiştirmenin iki kez kontrol edilmesi biraz çaba gösterecektir. " Gerçekten de eserleri öneren gibi. Ancak çözümü test edip tamam olduğunu söylerseniz cevabımı buna göre düzenlerim. "Çözüm test etmek" ile yeni bir projeyi sıfırdan başlatmak ve işe yarayabildiğinden emin olmak istiyorum. Bunu yapmak ister misin? ;) –

+0

@GLorieul Yukarıdaki şablonu sadece noktalı isim sözdizimini kullanarak kullandım ve başarıyla derledim. – Gilly

İlgili konular