2012-04-12 13 views
4

私のC++コードをPythonでPythonに移植しようとしています。(Swig to python)インポートエラー:動的モジュールがinit関数を定義していません

Python(コマンドライン)でpy、pyd、cxx、libファイルをビルドすると、 "module Dnld"のキーが表示されます.->インポートエラー:動的モジュールでinit関数が定義されていません。 次は、さらに

私のコードです:マークTolonen

  1. ファイル - >新規作成 - >プロジェクト - > Windowsコンソールアプリケーション - >を選択DLLありがとう、誤解を避けるために、私のビルドステップを追加し、空のプロジェクト(ユニコードなし)
  2. 私のSerialCommフォルダをプロジェクトに追加します(DownloaderEngine.h Serial.h PortEnumerator.hなどを含みます)。
  3. の構成プロパティ - > C/C++ - >追加などがdirectories-> C:\ Python27 \が含ま
  4. の構成プロパティ - >リンカー - >一般 - >出力ファイル - > $(OUTDIR)\ Dnld.pyd
  5. の構成プロパティ - >リンカー - >入力 - >追加directories-を含める> C:\ Python27 \ LIBS \ python27.libと\ SERIALCOMM \
  6. setupapi.libカスタム
  7. DNLDを構築するか、Dnld.iを追加します。 >プロパティページ - >コマンドライン - > swig -C++ -python $(InputPath)
  8. Dnld.iプロパティページ - >出力 - > $(InputName)_warp.cpp
  9. ビルド、Dnld_wrap.cxx、Dnld.py
  10. がDnld.pydを作成し、それはそれだ

(的環境:VC2008でXP SP3)、すべてを再構築し、私のプロジェクトでDnld_wrap.cxxを追加作成

//DownloaderEngine.h 
class __declspec(dllexport) CDownloaderEngine 
{ 
public: 
    CDownloaderEngine(); 

    virtual ~CDownloaderEngine(); 

    signed char OpenPort(signed char _ucPort, unsigned long _ulBaudRate, unsigned char _ucParity, 
     unsigned char _ucStopBits,unsigned char _ucData); 

    .... 
}; 

//DownloaderEngine.cpp 
CDownloaderEngine::CDownloaderEngine() 
{ 
    .... 
} 

CDownloaderEngine::~CDownloaderEngine() 
{ 
    .... 
} 

//DownloaderEngine.i 
%module Dnld 

%include <windows.i> 
%include <std_vector.i> 
%include <std_map.i> 
%{ 
    #define SWIG_FILE_WITH_INIT 
    #include ".\SerialComm\DownloaderEngine.h" 
%} 

/* Parse the header file to generate wrappers */ 
%include ".\SerialComm\DownloaderEngine.h" 
+2

+1 "申し訳ありません": – mihai

+0

こんにちは、mihai、私の英語は良くないです(台湾から来ています)。私の文法が間違っていれば、本当に残念です... :( – user1328842

+0

Haveあなたはここを見ました:http://www.swig.org/Doc1.3/Python.html?31.2.5。 –

答えて

5

問題が発生する可能性が高いため、十分な情報ではありません。

swig -python -c++ DownloaderEngine.i 
cl /LD /W4 /Fe_Dnld.pyd /Ic:\Python27\include downloaderEngine_wrap.cxx -link /LIBPATH:c:\Python27\libs DownloaderEngine.lib 

編集:たとえば、あなたが指定したファイルを、VS2008のコマンドプロンプトから構築するようなものでなければなりませんあなたのビルド手順は、右について見えるが、一つのことは.pydファイルが期待されています_Dnld.pyd(アンダースコアに注意してください)と命名します。

生成されたDnld.pyimport _Dnld(.pyd)を呼び出すため、Pythonスクリプトでimport Dnld(.py)となります。

例:

>>> import Dnld 
>>> engine = Dnld.CDownloaderEngine() 
>>> result = engine.OpenPort(...) 

これは私がアンダースコアなしで.pydの名前を変更する場合、私は取得エラーです:

>>> import Dnld 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: dynamic module does not define init function (initDnld) 

だから私は、これはあなたの問題を解決すると確信しています。私很高興幫助你!

+0

Mark Tolonen – user1328842

+0

こんにちは、Mark Tolonenさん、結果は以下の通りです(私は出力に_Dnld.pydに変更しました) ...私は、私の記事にビルドステップを追加しました。 >>>インポートD NLD トレースバック(最新の呼び出しの最後): インポートDNLD はImportErrorで ファイル ""、行1、:動的モジュールは、init関数を定義していません(initDnld) – user1328842

+0

あなたはより古い 'Dnld.pyd'を削除しました出力ディレクトリ?このエラーは、アンダースコア以外のバージョンを読み込んだことによるものです。 –

0

これは私が理解するのに時間がかかりました。 python.orgのメーリングリストhereから、PythonはモジュールFooがinitFoo関数を提供することを期待しているようです。その場合、DnldがinitDnldを提供しないのはなぜですか?swigはその大半を処理するはずなので、swigは完成したライブラリがDnldと呼ばれることを期待していないためです(dnldやD_nldなどが必要な場合は失敗しますが、ファイルの名前を変更すると修正されます)。 pyrex/cythonとboostによって生成されたものを含む、Pythonの任意のC拡張に適用されます。

関連する問題