Cython和distutils

4

我希望使用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)

init.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
1个回答

8
我之前没有意识到这一点:
我报告cython主要代码之一(Lisandro Dalcin)的答案(抱歉跨帖)。 http://groups.google.com/group/cython-users/browse_thread/thread/cbacb7e848aeec31
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'], ...) 

你是真的提供了多种解决他问题的方法,还是在编辑你已经给出的答案?如果你在编辑,请整理一下这篇帖子,并使用想要保留的答案下方的“编辑”链接。 - Mike Pennington
问题是SO与Opera 11.62不能正常工作。我无法使用回车键在帖子编辑中换行。 - J_Zar
但这将把所有pyx文件作为一个模块处理(即将所有符号放入一个命名空间中)? - Ruediger Jungbeck
1
是的。结果将是一个单独的模块(pyd文件)。 - J_Zar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接