2015-01-08 13 views
6

Próbuję przekonwertować z użycia pyximport do budowania za pomocą distutils, i jestem pod wrażeniem dziwnych wyborów gdzie umieścić pliki .so. Postanowiłem więc zbudować tutorial z dokumentacji cythonu, tylko po to, aby znaleźć wydruk komunikatu mówiącego o jego budowie, ale nie. Jestem w virtualenv, a cython, python2.7 itp. Są w nim zainstalowane.Cython build przez setup.py działa źle (umieszczając wszystkie pliki .so w dodatkowym katalogu)

Pierwsze podstawy:

$ cython --version 
Cython version 0.21.2 
$ cat setup.py 
from distutils.core import setup 
from Cython.Build import cythonize 
print "hello build" 
setup(
    ext_modules = cythonize("helloworld.pyx") 
) 
$ cat helloworld.pyx 
print "hello world" 

Teraz, kiedy go zbudować wszystko wygląda ok z wyjątkiem dodatkowego src/src rzeczy na wyjściu:

$ python setup.py build_ext --inplace 
hello build 
Compiling helloworld.pyx because it changed. 
Cythonizing helloworld.pyx 
running build_ext 
building 'src.helloworld' extension 
x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c helloworld.c -o build/temp.linux-x86_64-2.7/helloworld.o 
creating /home/henry/Projects/eyeserver/dserver/src/src 
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -D_FORTIFY_SOURCE=2 -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security build/temp.linux-x86_64-2.7/helloworld.o -o /home/henry/Projects/eyeserver/dserver/src/src/helloworld.so 

I kiedy go uruchomić, to z Oczywiście nie:

$ echo "import helloworld" | python 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
ImportError: No module named helloworld 

Aż przenieść plik .so z jego dodatkowym katalogu src:

$ mv src/helloworld.so . 
$ echo "import helloworld" | python 
Hello world 

Co robię źle? Oczywiście mogłem sprawić, że proces kompilacji przenosiłby wszystkie pliki .so, ale to wydaje się naprawdę hackowe.

+2

Nie mogę odtworzyć z 'python-2.7.6' i' cython-0.21.2' na maszynie osx. – cel

+0

Dlaczego twój plik .so znajduje się w katalogu 'src'? Skąd się wziął ten katalog. Nigdy nie wspominałeś o tym w swojej konfiguracji. – fnl

+0

BTW, nawet jeśli przeniesię 'helloworld.pyx' do katalogu" src "wewnątrz projektu i zmienię linię cytonizującą w' setup.py' odpowiednio za pomocą 'src/helloword.pyx', to nadal umieszcza plik .so w głównym katalogu projektu. Myślę, że musi istnieć coś więcej w konfiguracji twojego projektu. – fnl

Odpowiedz

5

Zawsze, gdy używam cytonu, używam polecenia Extension.

chciałbym napisać plik setup.py następująco:

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Build import cythonize 

extensions = [ 
    Extension("helloworld", ["helloworld.pyx"]) 
] 

setup(
    ext_modules = cythonize(extensions) 
) 

Mam nadzieję, że ten będzie następnie umieścić plik .so w bieżącym katalogu.

+0

Wydaje się, że rozszerzenia nie są zdefiniowane, gdy uruchamiam plik instalacyjny jako podany - co robię źle. Importowanie distutils.core.Extensions też nie działa ... –

+1

Musisz zrobić "from distutils.extension import Extension", a nie z core. Oto dobry przykład [setup.py] (https://github.com/syllog1sm/redshift/blob/master/setup.py) dla projektu Cython. – fnl

+1

Występuje literówka w wywołaniu 'Extension' (dodatkowe" s "). Próbowałem edytować wpis, ale muszę edytować co najmniej 6 znaków: S. – rocarvaj

Powiązane problemy