Schreiben einer Python-Erweiterung in Go (Golang)

Lesezeit: 3 Minuten

Benutzeravatar von tehwalrus
das Walross

Ich verwende derzeit Cython, um C und Python zu verknüpfen und in langsamen Python-Codes schneller zu werden. Ich möchte jedoch Goroutinen verwenden, um ein wirklich langsames (und sehr parallelisierbares) Stück Code zu implementieren, aber es muss von Python aus aufrufbar sein. (Ich habe diese Frage bereits gesehen)

Ich bin (irgendwie) glücklich, über C (oder Cython) zu gehen, um bei Bedarf Datenstrukturen usw. einzurichten, aber das Vermeiden dieser zusätzlichen Ebene wäre aus Sicht der Fehlerbehebung/Vermeidung gut.

Was ist der einfachste Weg, dies zu tun, ohne irgendwelche Räder neu erfinden zu müssen?

Benutzeravatar von Colonel Panic
Oberst Panik

Aktualisierung 2015: möglich ab Go 1.5 https://blog.filippo.io/building-python-modules-with-go-1-5/

Mit Go 1.5 können Sie .so-Objekte erstellen und sie als Python-Module importieren, indem Sie Go-Code (anstelle von C) direkt aus Python ausführen.

Siehe auch https://github.com/go-python/gopy

gopy generiert ein CPython-Erweiterungsmodul aus einem go-Paket.

  • Das Projekt github.com/go-python/gopy macht dies absurd einfach, indem es alle notwendigen Installationen für Sie erstellt, die im Blogbeitrag erwähnt werden.

    – Chris Townsend

    10. November 2015 um 1:16 Uhr

  • gopy ist derzeit nicht mit Go>=1.6 kompatibel, das war also nur von kurzer Dauer.

    – mattmc3

    3. August 2016 um 14:36 ​​Uhr

  • gopy wurde aktualisiert, um neuere Versionen von Go zu unterstützen. Es verwendet die Build-Option “c-shared” und das pybindgen-Projekt

    – dre-hh

    28. Mai 2020 um 22:37 Uhr

Leider ist dies derzeit nicht möglich. Go kann C-Code ausführen (und dieser C-Code kann dann Go zurückrufen), aber die main Funktion muss in Go seindamit die Go-Laufzeit Dinge einrichten kann.

  • Vielleicht ist es dann möglich, go in einem separaten Prozess über xmlrpc aufzurufen?

    – jsbueno

    16. September 2012 um 4:54 Uhr

  • Sie können Sockets verwenden, um RPC auszuführen.

    – Wladimir Matwejew

    16. September 2012 um 8:33 Uhr

  • Es ist ziemlich einfach, Python in ein C-Programm einzubetten. Ich frage mich, ob Sie dieses C-Programm dann in ein Go-Programm einbetten könnten … Die Python- und Go-Interaktionen müssten über die C-Schicht erfolgen.

    – Nick Craig-Wood

    16. September 2012 um 19:37 Uhr


  • Für die Kommunikation zwischen Go- und Python-Prozessen könnten Sie das Python-Programm in einem anderen Prozess ausführen und stdin, stdout verwenden, um zwischen den Prozessen zu kommunizieren (Paket os/exec). JSON wäre dafür besser als XMLRPC, da XML derzeit in Go etwas schwieriger zu handhaben ist als JSON.

    – Matt

    17. September 2012 um 11:50 Uhr

  • Dies ist jetzt mit Go 1.5 möglich – siehe github.com/jbuberel/buildmodeshared für Arbeitsbeispiele.

    – Jason Buberel

    23. August 2015 um 15:12 Uhr

Ich habe eine Erweiterung für setuptools geschrieben, mit der Sie Cpython-Erweiterungen schreiben können, die mit go verbunden sind: https://github.com/asottile/setuptools-golang

Hier sind ein paar Beispielerweiterungen:

Das Schöne ist, dass diese wie alle anderen installiert werden können pip Paket und unterstützen sowohl Cpython als auch Pypy.

PEP 513 Manylinux1-Räder können auch erstellt werden, um vorgefertigte Räder über die bereitzustellen setuptools-golang-build-manylinux-wheels Werkzeug.

Der Ansatz ist nahezu identisch mit dem in der Antwort von @ColonelPanic, verwendet jedoch einige zusätzliche Tricks, um die Kompatibilität mit Python2 und Python3 zu ermöglichen.

Benutzeravatar von uriel
Uriel

Da ist ein go-python Paket, um Ihnen beim Schreiben von Python-Erweiterungen in Go zu helfen:

Dieses Paket stellt eine ausführbare Datei „go-python“ bereit, die einfach „python“ lädt und dann python.Py_Main(os.Args) aufruft. Der Grund dafür ist, dass unter einer solchen ausführbaren Datei go-basierte Erweiterungen für C-Python einfacher zu implementieren wären (da dies normalerweise bedeutet, dass go von C durch einige ziemlich komplizierte Funktionssprünge aufgerufen wird).

1409330cookie-checkSchreiben einer Python-Erweiterung in Go (Golang)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy