我可以使用distutils创建一个静态Cython库吗?

时间:2014-04-04 00:44:29

标签: python static-libraries cython distutils

我想使用distutils构建一个静态Cython库。我不关心它是一个可以导入的真正的Python扩展模块。我只想编译代码并将对象放在静态库中。创建动态库的代码非常简单,

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
   cmdclass = {'build_ext':build_ext},
   ext_modules = [Extension("test",["test.pyx"])]
)

是否有一种简单的方法可以让它变为静态?

3 个答案:

答案 0 :(得分:2)

Distutils非常有限,并未针对静态构建进行设置。我建议你使用其他东西来编译项目的静态库部分。

如果您的用例是从其他C代码调用Cython代码,那么您希望在Cython代码中使用public or api declarations以及cdef声明的函数和变量。 Cython将允许从外部C代码调用如此声明的对象,它将为.h文件生成一个.c文件。

答案 1 :(得分:1)

Fyi,这可以使用numpy distutils,但显然远不及共享库的原始代码的简单性或可能的可移植性,

from Cython.Compiler.Main import compile
from numpy.distutils.misc_util import Configuration

compile('test.pyx')
config = Configuration(...)
config.add_installed_library('test',
                         ['test.c'],
                         'test',
                         {'include_dirs':[get_python_inc()]})

答案 2 :(得分:0)

假设您的setup.py中有import { Component, OnInit, AfterContentInit } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'app-root', template: '<router-outlet></router-outlet>' }) export class AppComponent implements OnInit { constructor(translate: TranslateService) { translate.addLangs(['es']); translate.setDefaultLang('es'); const browserLang: string = translate.getBrowserLang(); translate.use(browserLang.match(/en|es/) ? browserLang : 'es'); } ngOnInit() { } } sourcesinclude_dirs,这就是构建静态库的方法

build_dir

来源:https://gist.github.com/udnaan/d549950a33fd82d13f9e6ba4aae82964