1. 編譯出來的so比網上流傳的其他方法小很多。
2. language_level 是python的主版本號,如果python版本是2.x,目前的版本Cython需要人工指定language_level.
3. python setup.py build_ext --inplace 執行腳本
4. 以下是代碼片段
from distutils.core import Extension, setup
from Cython.Build import cythonize
from Cython.Compiler import Options
# __file__ 含有魔術變量的應當排除,Cython雖有個編譯參數,但只能設置靜態。
exclude_so = ['__init__.py', "mixins.py"]
sources = ['core', 'libs']
extensions = []
for source in sources:
for dirpath, foldernames, filenames in os.walk(source):
for filename in filter(lambda x: re.match(r'.*[.]py$', x), filenames):
file_path = os.path.join(dirpath, filename)
if filename not in exclude_so:
extensions.append(
Extension(file_path[:-3].replace('/', '.'), [file_path], extra_compile_args = ["-Os", "-g0"],
extra_link_args = ["-Wl,--strip-all"]))
Options.docstrings = False
compiler_directives = {'optimize.unpack_method_calls': False}
setup(
# cythonize的exclude全路徑匹配,不靈活,不如在上一步排除。
ext_modules = cythonize(extensions, exclude = None, nthreads = 20, quiet = True, build_dir = './build',
language_level = 2 或者3 , compiler_directives = compiler_directives))