cythonで書いたコードをVC++でビルドする時の注意点
概要
pythonで書いた機能をwindowsデスクトップアプリに組み込みたい場合、cythonで機能を書いてVC++でdllにビルドするという方法があります。この時にハマったことを残しておきたいと思います。
内容と対応
setup.pyを実行すると"ImportError: DLL load failed"
(これはVC++じゃないですね)コマンドラインで実行したらこのエラーが出るのですが、anaconda promptでは起きませんでした。anaconda promptで実行しましょう。(たぶんパスが通ってないんだと思います)
No module named 'encodings'
python.exeのパスを環境変数に追加してください。
プリコンパイル済みヘッダーファイルを開けません
プロパティ → c/c++ → プリコンパイル済みヘッダー → プリコンパイル済みヘッダを使用しない
に変更してください。(cython関係ない?)
プリコンパイル済みヘッダはヘッダファイルのローディング効率よくするためのものなのでなくても大丈夫みたいです。
kernel32.libが見つかりません
プロパティ → VC++ディレクトリ → ライブラリディレクトリにanacondaの\Library\binを追加する際に既存のパスを消していました。それらは消さずに追加してください。(これはただの凡ミスですね、、、)
fatal error: 'numpy/arrayobject.h' file not found
cimport numpyをしている場合はasを使って名前を変えてimportしてください。setup.pyでinclude_dirsにnp.get_includeを加えろという記事が多くありますが、import とcimportを同じ名前でしている場合はこれは通用しないみたいです。
python37_d.dllが存在しません
debugビルドではなくrerleaseビルドにしてください。
最後に
自分がvc++に関してはほぼ素人なので暫定対策しか分かりませんが一応エラーは取ることができました、、、
そもそもcythonをc++に組み込むということ自体が稀なのであまり情報もなく大変でした。
最新記事
すべて表示やりたいこと 2次元配列に作用する処理がある 処理の対象となる配列が複数ある このような場合、この処理は関数化したいが、引数をどう定義するのかちょっと迷った やり方 配列サイズは固定とすれば、以下のようにすればよい // Define a typedef for the...
やりたいこと 掲題の通りだが、関数ポインタの配列を定義したい。 具体的にどう使うかというと、例えばpthread_createの第3引数は新規スレッドで実行したい関数のポインタを渡す。複数の関数に対してそれぞれ新規スレッドを割り当てる場合、それらのポインタを配列にしてまとめ...
概要 pythonでデータ解析を行っている。解析自体はpandasを用いて行い、最終結果はpandas.DataFrameの形式で保持されている。 この結果を他のアプリケーションで利用するため、json形式でファイル出力したい。 やり方 1...
Comments