Ответ 1
Обновление 2015: возможно по Go 1.5 https://blog.filippo.io/building-python-modules-with-go-1-5/
с Go 1.5 вы можете создавать .so объекты и импортировать их как модули Python, запуская код Go (вместо C) непосредственно из Python.
В настоящее время я использую Cython для связи C и Python и получаю ускорение в медленных битах кода python. Тем не менее, я хотел бы использовать goroutines для реализации очень медленного (и очень параллелизуемого) бита кода, но он должен быть вызван из python. (Я уже видел этот вопрос)
Я (вроде) счастлив пойти через C (или Cython), чтобы настроить структуры данных и т.д., если это необходимо, но избегать этого дополнительного слоя было бы хорошо с точки зрения исправления ошибок/избегания.
Каков самый простой способ сделать это без необходимости изобретать все колеса?
Обновление 2015: возможно по Go 1.5 https://blog.filippo.io/building-python-modules-with-go-1-5/
с Go 1.5 вы можете создавать .so объекты и импортировать их как модули Python, запуская код Go (вместо C) непосредственно из Python.
К сожалению, в настоящее время это невозможно. Go может запускать C-код (и этот C-код может затем перезванивать в Go), но функция main
должна быть в Go, поэтому время выполнения Go может настроить ситуацию.
Существует пакет go-python, чтобы помочь вам написать расширения Python в Go:
этот пакет предоставляет исполняемый "go-python", который просто загружает "python", а затем вызовите python.Py_Main (os.Args). рациональное бытие что под таким исполняемым файлом расширения go для C-Python будут быть легче реализовать (так как это обычно означает призыв к переходу от C через некоторые довольно запутанные функции hops)
Я написал расширение для setuptools, которое позволяет вам писать расширения cpython, которые взаимодействуют с go: https://github.com/asottile/setuptools-golang
Здесь есть несколько примеров расширений:
Оптимальная вещь: они могут быть установлены так же, как и любой другой пакет pip
, и поддерживают как cpython, так и pypy.
PEP 513 колесики manylinux1 также могут быть созданы для обеспечения предварительно созданных колес с помощью инструмента setuptools-golang-build-manylinux-wheels
.
Этот подход почти идентичен таковому в ответе @ColonelPanic, но использует некоторые дополнительные трюки для обеспечения совместимости с python2 + python3.