ฉันทำสิ่งนี้ด้วยตัวเองแล้วในแพ็คเกจ Python simplerandom
( BitBucket repo - แก้ไข: ตอนนี้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 ที่แจกจ่ายพร้อมกับรุ่นนั้น