Я сделал это сам сейчас, в пакете Python simplerandom
( Репозиторий BitBucket - РЕДАКТИРОВАТЬ: сейчас github ) (я не ожидайте, что это будет популярный пакет, но это был хороший шанс изучить Cython).
Этот метод основан на том факте, что при создании файла .pyx
с Cython.Distutils.build_ext
(по крайней мере, с Cython версии 0.14) всегда создается файл .c
в том же каталоге, что и исходный файл .pyx
.
Вот урезанная версия setup.py
, которая, я надеюсь, показывает основы:
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,
...
)
Я также отредактировал MANIFEST.in
, чтобы убедиться, что mycythonmodule.c
включен в исходный дистрибутив (исходный дистрибутив, созданный с помощью python setup.py sdist
):
...
recursive-include cython *
...
Я не фиксирую mycythonmodule.c
для контроля версий 'trunk' (или 'default' для Mercurial). Когда я делаю релиз, мне нужно помнить сначала сделать python setup.py build_ext
, чтобы убедиться, что mycythonmodule.c
присутствует и актуален для распространения исходного кода. Я также делаю ветку релиза и фиксирую файл C в ветке. Таким образом, у меня есть историческая запись файла C, который был распространен с этим выпуском.