web-dev-qa-db-fra.com

Écrire une extension Python dans Go (Golang)

J'utilise actuellement Cython pour lier C et Python, et obtenir une accélération en bits lents de python. Cependant, j'aimerais utiliser des goroutines pour implémenter un bit de vraiment lent (et très parallélisable) de du code, mais il doit pouvoir être appelé depuis python. (J'ai déjà vu cette question )

Je suis (en quelque sorte) heureux de passer par C (ou Cython) pour configurer des structures de données, etc. si nécessaire, mais éviter cette couche supplémentaire serait bien du point de vue de la correction/évitement de bogues.

Quelle est la façon la plus simple de le faire sans avoir à réinventer des roues?

45
tehwalrus

Mise à jour 2015 : possible à partir de Go 1.5 https://blog.filippo.io/building-python-modules-with-go- 1-5 /

avec Go 1.5, vous pouvez créer des objets .so et les importer en tant que modules Python, exécutant du code Go (au lieu de C) directement à partir de Python.

39
Colonel Panic

Malheureusement, ce n'est actuellement pas possible. Go peut exécuter du code C (et ce code C peut ensuite être rappelé dans Go), mais la fonction main doit être dans Go , afin que le runtime Go puisse configurer les choses.

10
Russ Amos

Il y a un paquet go-python précisément pour vous aider à écrire les extensions Python dans Go:

ce paquet fournit un exécutable "go-python" qui charge juste "python" et appelle ensuite python.Py_Main (os.Args). le rationnel étant que sous un tel exécutable, les extensions basées sur go pour C-Python seraient plus faciles à implémenter (car cela signifie généralement appeler go depuis C via des fonctions plutôt compliquées Hops)

3
uriel

J'ai écrit une extension pour setuptools qui vous permet d'écrire des extensions cpython qui s'interfacent avec go: https://github.com/asottile/setuptools-golang

Il y a quelques exemples d'extensions ici:

La chose intéressante est qu'ils peuvent être installés comme n'importe quel autre paquet pip et supportent à la fois cpython et pypy.

PEP 51 les roues manylinux1 peuvent également être construites pour fournir des roues pré-construites via le setuptools-golang-build-manylinux-wheels outil.

L'approche est presque identique à celle de la réponse de @ ColonelPanic mais utilise quelques astuces supplémentaires pour activer la compatibilité python2 + python3.

2
Anthony Sottile