2017-10-27 16 views
1

私はPythonが埋め込まれたC++ライブラリを開発しています。私がしたいのは、Pythonライブラリを静的にリンクすることです。プロダクションサーバに切り替えると、設定上の問題は発生しません。これまでのところ、libpython3.5m.aを静的にリンクすることができました(ソースからPythonをビルドしなければなりませんでした。パッケージライブラリは-fPICフラグでコンパイルされていないようです)。しかし、私が問題に来て、それが思われること、ないnumpyのはありません。ということ、PythonライブラリをNumpyでC(C++)に静的にリンク

ImportError: numpy.core.multiarray failed to import 

そして、このエラーはimport_array1()マクロによって引き起こされる:私は私のライブラリを使用するアプリケーションを実行すると、それはエラーで私を促し(AFAIK)は、numpyルーチンをC++にインポートするために使用されます。 libnpymath.alibnpysort.aをリンクしようとしましたが、これはnumpyビルドディレクトリにありますが、無駄です。このような静的なリンクが可能で、それをどうやって行うのか知っていますか?私はnumpyがC言語で書かれているので、可能であるはずです。

+0

質問の最初の部分は、なぜあなたはdllファイルを使用しないでください! dllファイルを呼び出してctypesモジュールでそれらの関数を使うこともできます... sys.path.append( './ yourpath/yourpath')関数を使ってsysモジュールとの静的リンクを行うこともできますあなた自身のモジュールをインポートしてください... – DRPK

+0

@DRPK問題は他のライブラリと同じです(私はLinux上にあるので、.dllよりむしろ.sollです)。私はubuntu16で開発しました。サーバーはdebianのストレッチです.2つの異なるバージョンのlibc.so(C++のライブラリ)があります。私は1つでコンパイルできず、他のものを使うことができないので、私は静的にリンクしたい。そして同じ状況がPythonのためです。私は3.5、3.4があります... –

答えて

1

これはPythonのコアに過ぎず、すべてのPythonライブラリを除外します。それでも、すべてのPythonコードを出荷する必要があります。

...since numpy is written in C...

これは間違っています。 NumPyはC言語では半分、Pythonでは半分で書かれています。 numpy.core.multiarrayはCで書かれており、通常はそれを自分でインポートすることはないので、通常はNumPyのPython部分でインポートされますので、Cの部分はここにロードされていない部分です。

とにかくCコードでリンクすると、Cコードによってエクスポートされた関連するPythonモジュールを初期化する必要があります。静的リンクがなければ、Pythonはmultiarray.soファイルを正しい場所に見つけてロードするだけです。静的にPythonをビルドするときは、普通はPythonに静的にコンパイルしたいモジュールでModules/Setup.localファイルを編集します。しかし、これはNumPyのような任意のサードパーティのモジュールで動作するようには設計されていません。参照してください:あなただけのPythonの同じバージョンが両方の開発・生産システム上で実行されていることを確認しようとしている場合Compile the Python interpreter statically?


正直なところ、virtualenvのように、これを行うには大幅簡単な方法があります。 CPythonは単に静的にリンクされるようには設計されていません。

関連する問題