Tôi đã tự mình thực hiện việc này ngay bây giờ, trong một gói Python simplerandom
( BitBucket repo - EDIT: now github ) (Tôi không mong đợi đây là một gói phổ biến, nhưng đó là một cơ hội tốt để học Cython).
Phương pháp này dựa trên thực tế là việc xây dựng .pyx
tệp với Cython.Distutils.build_ext
(ít nhất là với Cython phiên bản 0.14) dường như luôn tạo .c
tệp trong cùng thư mục với .pyx
tệp nguồn .
Đây là một phiên bản rút gọn setup.py
mà tôi hy vọng sẽ hiển thị những điều cần thiết:
from distutils.core import setup
from distutils.extension import Extension
try:
from Cython.Distutils import build_ext
except ImportError:
use_cython = False
else:
use_cython = True
cmdclass = {}
ext_modules = []
if use_cython:
ext_modules += [
Extension("mypackage.mycythonmodule", ["cython/mycythonmodule.pyx"]),
]
cmdclass.update({'build_ext': build_ext})
else:
ext_modules += [
Extension("mypackage.mycythonmodule", ["cython/mycythonmodule.c"]),
]
setup(
name='mypackage',
...
cmdclass=cmdclass,
ext_modules=ext_modules,
...
)
Tôi cũng đã chỉnh sửa MANIFEST.in
để đảm bảo điều đó mycythonmodule.c
được bao gồm trong bản phân phối nguồn (bản phân phối nguồn được tạo bằng python setup.py sdist
):
...
recursive-include cython *
...
Tôi không cam kết mycythonmodule.c
kiểm soát phiên bản 'thân cây' (hoặc 'mặc định' cho Mercurial). Khi tôi thực hiện một bản phát hành, tôi cần phải nhớ thực hiện một bước python setup.py build_ext
đầu tiên, để đảm bảo rằng bản phát hành đó mycythonmodule.c
có sẵn và cập nhật cho bản phân phối mã nguồn. Tôi cũng tạo một nhánh phát hành và cam kết tệp C vào nhánh. Bằng cách đó, tôi có một bản ghi lịch sử của tệp C đã được phân phối cùng với bản phát hành đó.