50

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

必要に応じて、C(またはCython)を介してデータ構造などを設定できてうれしいですが、バグ修正/回避の観点から、この余分なレイヤーを回避することをお勧めします。

ホイールを作り直すことなくこれを行う最も簡単な方法は何ですか?

4

4 に答える 4

44

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

Go 1.5 では、.so オブジェクトをビルドし、それらを Python モジュールとしてインポートして、(C ではなく) Go コードを Python から直接実行できます。

https://github.com/go-python/gopyも参照してください

gopy は、go パッケージから CPython 拡張モジュールを生成します。

于 2015-09-27T21:29:39.597 に答える
10

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

于 2012-09-16T01:39:45.873 に答える
3

go と連携する cpython 拡張機能を作成できる setuptools の拡張機能を作成しました: https://github.com/asottile/setuptools-golang

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

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

PEP 513 manylinux1 wheel をビルドして、setuptools-golang-build-manylinux-wheelsツールを介してビルド済みの wheel を提供することもできます。

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

于 2017-02-01T05:52:20.813 に答える
2

GoでPython拡張機能を作成するのに役立つgo-pythonパッケージがあります。

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

于 2012-09-17T03:28:14.087 に答える