2012-04-24 15 views
4

複数の.pyxファイルを実行可能パッケージ(.DLL)に変換するためにCythonを使用したいと思います。Cythonとdistutils

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 

答えて

6

私はこれを認識していませんでした:

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

私はcython(クロスポストして申し訳ありません)のメインコーダー(リサンドロDalcin)のうちの一つの答えを報告:

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

あなたは2つの異なるソースから構築されたシングル「MyModuleという」を持つことはできません。 おそらく、あなたは2行以下 で、「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ファイルを1つのモジュールとして扱います(つまり、すべてのシンボルを1つの名前空間に入れます)? –