2015-01-08 18 views
6

Tôi đang cố gắng để chuyển đổi từ sử dụng pyximport để xây dựng thông qua distutils, và tôi đang stumped bởi những lựa chọn kỳ lạ của nó làm cho nơi để đặt các tập tin .so. Vì vậy, tôi quyết định xây dựng hướng dẫn trong tài liệu cython, chỉ để tìm thấy nó in một thông báo nói rằng tòa nhà của nó, nhưng không phải. Tôi đang ở trong một virtualenv, và cython, python2.7, vv được cài đặt trong đó.cython xây dựng thông qua setup.py không điều sai (đặt tất cả các tập tin .so trong src dir thêm)

Đầu những điều cơ bản:

$ 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" 

Bây giờ Khi tôi xây dựng nó tất cả mọi thứ trông ok ngoại trừ những thứ src/src thêm trong đầu ra:

$ 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 

Và khi tôi chạy nó, nó của Tất nhiên không:

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

Cho đến khi tôi di chuyển .so nộp ra khỏi thư mục src phụ của nó:

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

Tôi đang làm gì sai? Rõ ràng tôi có thể làm cho quá trình xây dựng di chuyển tất cả các tệp .so, nhưng điều đó có vẻ thực sự bị hack.

+2

Tôi không thể sao chép bằng 'python-2.7.6' và' cython-0.21.2' trên máy osx. – cel

+0

Tại sao tệp .so của bạn nằm trong thư mục 'src'? Thư mục đó đến từ đâu. Bạn không bao giờ đề cập rằng trong thiết lập của bạn. – fnl

+0

BTW, ngay cả khi tôi di chuyển 'helloworld.pyx' vào thư mục" src "bên trong dự án và thay đổi dòng cythonize trong' setup.py' tương ứng bằng cách sử dụng 'src/helloword.pyx', nó vẫn đặt tệp .so trong thư mục cơ sở của dự án. Tôi nghĩ rằng phải có một cái gì đó nhiều hơn để thiết lập dự án của bạn. – fnl

Trả lời

5

Bất cứ khi nào tôi sử dụng cython, tôi sử dụng lệnh Extension.

Tôi sẽ viết các tập tin setup.py như sau:

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

Hy vọng này sau đó sẽ đưa file .so trong thư mục hiện hành.

+0

Các tiện ích dường như không được xác định khi tôi chạy tệp thiết lập của bạn như đã cho - tôi đang làm gì sai. Nhập distutils.core.Extensions không hoạt động ... –

+1

Bạn cần làm 'từ distutils.extension Import Extension', không phải từ lõi. Dưới đây là một ví dụ về [setup.py] (https://github.com/syllog1sm/redshift/blob/master/setup.py) cho một dự án Cython. – fnl

+1

Có lỗi đánh máy trong cuộc gọi đến 'Tiện ích mở rộng' (bổ sung" s "). Đã cố gắng chỉnh sửa bài đăng, nhưng tôi phải chỉnh sửa ít nhất 6 ký tự: S. – rocarvaj

Các vấn đề liên quan