【问题标题】:Cython and distutilsCython 和 distutils
【发布时间】:2012-04-24 15:04:34
【问题描述】:

我想使用 Cython 将多个 .pyx 文件转换为可执行包 (.DLL)。

如何通过 distutils 从多个 .pyx 创建单个 Windows DLL?

使用的样本:

sub1.pyx:

cimport sub1

class A():
    def test(self, val):
        print "A", val

sub1.pxd:

cdef class A:
    cpdef test(self,val)

sub2.pyx:

cimport sub2

class B():
    def test(self):
        return 5

sub2.pxd:

cdef class B:
    cpdef test(self)

初始化.py:

cimport sub1
cimport sub2

import sub1
import sub2

setup.py:

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

ext_modules = [Extension("sub", ["__init__.pyx", "sub1.pyx", "sub2.pyx"])]

setup(
  name = 'Hello world app',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules
)

错误:

sub1.obj : error LNK2005: ___pyx_module_is_main_sub already defined in __init__.obj
sub1.obj : error LNK2005: _initsub already defined in __init__.obj
sub2.obj : error LNK2005: ___pyx_module_is_main_sub already defined in __init__.obj
sub2.obj : error LNK2005: _initsub already defined in __init__.obj
Creating library build\temp.win32-2.7\Release\sub.lib and object build\temp.win32-2.7\Release\sub.exp
C:\temp\ctest\sub\sub.pyd : fatal error LNK1169: one or more multiply defined symbols found

【问题讨论】:

    标签: python cython distutils


    【解决方案1】:

    我不知道这一点:

    http://groups.google.com/group/cython-users/browse_thread/thread/cbacb7e848aeec31

    我报告了 cython 的一位主要编码员 (Lisandro Dalcin) 的答案(抱歉交叉发帖):

    ext_modules=[ 
        Extension("myModule", 
                  sources=['src/MyFile1.pyx', 
                           'src/MyFile2.pyx'], 
    

    您不能从两个不同的来源构建一个“myModule”。 也许您可以添加一个“src/myModule.pyx”文件,其中包含两行 下面:

    # file: myModule.pyx 
    include "MyFile1.pyx" 
    include "MyFile2.pyx" 
    

    然后使用

    Extension("myModule", sources=['src/myModule.pyx'], ...) 
    

    【讨论】:

    • 你真的给出了多种方法来解决他的问题,还是编辑你已经给出的答案?如果您正在编辑,请清理此帖子并使用您要保留的答案下方的“编辑”链接。
    • 问题是 SO 在 Opera 11.62 中不能正常工作。我无法使用回车键在帖子编辑中换行。
    • 但这会将所有 pyx 文件作为一个模块处理(即将所有符号放入一个命名空间)?
    • 是的。结果将是单个模块(pyd 文件)。
    猜你喜欢
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多