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

Python 我可以使用distutils创建静态Cython库吗?,python,static-libraries,cython,distutils,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},

我想使用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"])]
)

有没有一种简单的方法可以让它变成静态的

Distutils非常有限,并且不是为静态构建设置的。我建议您使用其他工具来编译项目的静态库部分


如果您的用例是从其他C代码调用Cython代码,那么您需要在Cython代码中使用声明的函数和变量。Cython将允许从外部C代码调用所声明的对象,它将在
.C
文件旁边为您生成一个
.h
文件。

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()]})

假设您在setup.py中有
包含_dirs
生成_dir
,这就是如何构建静态库的方法

from distutils.ccompiler import new_compiler 
from sysconfig import get_paths 
import os

project_name = "slimey_project"
source = ['source1.c']
include_dirs = ['include']
build_dir = os.path.join(os.path.dirname(__file__), 'build')

class StaticLib(Command): 
    description = 'build static lib' 
    user_options = [] # do not remove, needs to be stubbed out! 
    python_info = get_paths() 

    def initialize_options(self):
        pass

    def finalize_options(self):
        pass

    def run(self):
        # Create compiler with default options
        c = new_compiler()

        # Optionally add include directories etc.
        for d in include_dirs:
            c.add_include_dir(d)

        c.add_include_dir(self.python_info['include'])
        # Compile into .o files
        objects = c.compile(sources)

        # Create static or shared library
        c.create_static_lib(objects, project_name, output_dir=build_dir)

来源:

如果是静态的,您将如何从Python导入库?是否要将Python解释器与之静态链接?我不需要从Python导入库。这用于从C程序调用Python代码。我的程序将与libpython动态链接。嗨,阿德南,你能详细说明一下如何使用它吗?我刚开始编译cython,你能提供一个基本的例子吗?谢谢如果您将这个文件(setup.py)保存在一个目录中,在同一个目录中创建一个source1.c,并运行python setup.py,它将创建静态库。