2017-06-02 8 views
1

オープンソースプロジェクト1では、Python/CythonとC/C++モジュールがPython C APIを使用して1つのC++ライブラリと混在しています。 APIは、いくつかの関数の名前を2から3に変更しました。ライブラリがそれらの関数なしで記述されていると仮定します。 Python2でコンパイルするとPython3にリンクされますか?これはAPIヘッダーのマクロによって防止されていますか?バイナリ両方のPython C APIバージョン2と3を使用

両方にリンクする可能性のあるライブラリバイナリを持つと、大きな梱包の手間が省けます。

+0

かなり基本的な機能の名前が変更されました(たとえば、モジュールの初期化と思います)。 – DavidW

+0

APIは比較的安定していますが、A * B * Iはそうではありません。したがって、Pythonのバージョンごとに再コンパイルする必要があります。編集:@DavidWのコメントを参照してくださいAntti Haapalaの答えは、これの詳細については下記の答えです。 – Toby

答えて

1

いいえ、動作しません。試してはいけない。

バイナリモジュールは、3.5から3.6のようにバイナリポータブルであるとは保証されません。あなたがラッキーの場合、を実行することを禁止するメカニズムがあります。しかし、どういうわけかライブラリをリンクすると、PyObjectのレイアウト変更など、深刻なバグを引き起こす微妙な違いがあります。

正確なPythonバージョンのPythonインターフェイスを再コンパイルする必要があります。 Python 2とPython 3の間のソースの互換性は別のものであり、比較的簡単に達成できます。

+2

Python> = 3.2の場合、使用できる[安定したAPI](https://docs.python.org/3/c-api/stable.html)があります(ただし、完全なAPI )。明らかにOP問題には役立ちませんが、1つのバイナリモジュールで3.5と3.6を行うことができます。 – DavidW

+0

明確な答えとリンクの@DavidWをありがとう。 – rwst

関連する問題