Подтвердить что ты не робот

Написание расширения Python в Go (Golang)

В настоящее время я использую Cython для связи C и Python и получаю ускорение в медленных битах кода python. Тем не менее, я хотел бы использовать goroutines для реализации очень медленного (и очень параллелизуемого) бита кода, но он должен быть вызван из python. (Я уже видел этот вопрос)

Я (вроде) счастлив пойти через C (или Cython), чтобы настроить структуры данных и т.д., если это необходимо, но избегать этого дополнительного слоя было бы хорошо с точки зрения исправления ошибок/избегания.

Каков самый простой способ сделать это без необходимости изобретать все колеса?

4b9b3361

Ответ 1

Обновление 2015: возможно по Go 1.5 https://blog.filippo.io/building-python-modules-with-go-1-5/

с Go 1.5 вы можете создавать .so объекты и импортировать их как модули Python, запуская код Go (вместо C) непосредственно из Python.

Ответ 2

К сожалению, в настоящее время это невозможно. Go может запускать C-код (и этот C-код может затем перезванивать в Go), но функция main должна быть в Go, поэтому время выполнения Go может настроить ситуацию.

Ответ 3

Существует пакет go-python, чтобы помочь вам написать расширения Python в Go:

этот пакет предоставляет исполняемый "go-python", который просто загружает "python", а затем вызовите python.Py_Main (os.Args). рациональное бытие что под таким исполняемым файлом расширения go для C-Python будут быть легче реализовать (так как это обычно означает призыв к переходу от C через некоторые довольно запутанные функции hops)

Ответ 4

Я написал расширение для setuptools, которое позволяет вам писать расширения cpython, которые взаимодействуют с go: https://github.com/asottile/setuptools-golang

Здесь есть несколько примеров расширений:

Оптимальная вещь: они могут быть установлены так же, как и любой другой пакет pip, и поддерживают как cpython, так и pypy.

PEP 513 колесики manylinux1 также могут быть созданы для обеспечения предварительно созданных колес с помощью инструмента setuptools-golang-build-manylinux-wheels.

Этот подход почти идентичен таковому в ответе @ColonelPanic, но использует некоторые дополнительные трюки для обеспечения совместимости с python2 + python3.