Cython и distutils

Я хочу использовать Cython для преобразования нескольких файлов .pyx в исполняемый пакет (.DLL).

Как создать одну Windows DLL из нескольких .pyx с помощью distutils?

Используемый образец:

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

person Ruediger Jungbeck    schedule 24.04.2012    source источник


Ответы (1)


Я не знал об этом:

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

Сообщаю ответ одного из главных кодеров (Lisandro Dalcin) cython (извините за кросспостинг):

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'], ...) 
person J_Zar    schedule 02.05.2012
comment
Вы действительно даете несколько способов решения его проблемы или редактируете ответы, которые уже дали? Если вы редактируете, пожалуйста, очистите этот пост и используйте ссылку редактирования под ответом, который вы хотите сохранить. - person This; 02.05.2012
comment
Проблема в том, что SO некорректно работает с Opera 11.62. Я не могу использовать клавишу возврата каретки, чтобы иметь новую строку в редактировании сообщения. - person J_Zar; 02.05.2012
comment
Но это будет обрабатывать все файлы pyx как один модуль (т.е. помещать все символы в одно пространство имен)? - person Ruediger Jungbeck; 03.05.2012
comment
Да. Результатом будет один модуль (файл pyd). - person J_Zar; 03.05.2012