web-dev-qa-db-ja.com

GoでPython拡張機能を記述する(Golang)

現在、Cythonを使用してCとPythonをリンクし、pythonコードの遅いビットで高速化します。ただし、ゴルーチンを使用して、非常に遅い(非常に並列化可能な)ビットを実装したいと思います。コードですが、Pythonから呼び出し可能である必要があります(私はすでに この質問 を見ました)

必要に応じて、C(またはCython)を介してデータ構造などをセットアップすることは(ある程度)喜んでいますが、バグ修正/回避の観点からは、この余分なレイヤーを避けるのが良いでしょう。

車輪を再発明することなくこれを行う最も簡単な方法は何ですか?

44
tehwalrus

2015年更新:Go 1.5以降で可能 https://blog.filippo.io/building-python-modules-with-go- 1-5 /

go 1.5では、.soオブジェクトをビルドして、Pythonモジュールとして、Cの代わりにGoコードをPythonから直接実行してインポートできます。

38
Colonel Panic

残念ながら、これは現在不可能です。 GoはCコードを実行できます(そのCコードはGoにコールバックできます)が、 main関数はGoにある必要があります なので、Goランタイムは設定できます。

10
Russ Amos

GoでPython拡張機能を記述するのを正確に支援する go-python パッケージがあります。

このパッケージは、実行可能な「go-python」を提供し、「python」をロードしてからpython.Py_Main(os.Args)を呼び出します。そのような実行可能ファイルの下では、C-Pythonのgoベースの拡張機能の実装がより簡単になるという合理的な理由があります(これは通常、複雑な関数Hopsを介してCからgoを呼び出すことを意味するため)

3
uriel

私は、goとインターフェースするcpython拡張機能を作成できるsetuptoolsの拡張機能を作成しました。 https://github.com/asottile/setuptools-golang

ここにいくつかの拡張例があります:

すてきなことは、これらは他のpipパッケージと同じようにインストールでき、cpythonとpypyの両方をサポートできることです。

PEP 51 多くのlinux1ホイールをビルドして、setuptools-golang-build-manylinux-wheelsツール。

このアプローチは@ColonelPanicの答えとほぼ同じですが、追加のトリックを使用してpython2 + python3の互換性を有効にします。

1
Anthony Sottile