2012-04-24 3 views
4

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

Как создать единую библиотеку Windows из нескольких .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) 

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 

ответ

6

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

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

сообщить ответ одного из главных кодеров (Лисандро 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'], ...) 
+0

Вы действительно дает несколько способов решения его проблемы, или редактируя ответы, которые вы уже дали? Если вы редактируете, пожалуйста, очистите это сообщение и используйте ссылку «изменить» ниже ответа, который вы хотите сохранить. –

+0

Проблема в том, что SO не работает корректно с Opera 11.62. Я не могу использовать ключ возврата каретки, чтобы иметь новую строку в редактировании сообщения. –

+0

Но это будет обрабатывать все файлы pyx как один модуль (т.е. положить все символы в одно пространство имен)? –

Смежные вопросы