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?
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.
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.
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).
14093300cookie-checkSchreiben einer Python-Erweiterung in Go (Golang)yes