蔬菜小程序的开发全流程详解
693
2022-10-22
gopy 将Go语言开发的包载入到Python程序
gopy
gopy generates (and compiles) a CPython extension module from a go package.
This is a newly-improved version that works with current (e.g., 1.12) versions of Go, and uses unique int64 handles to interface with python, so that no pointers are interchanged, making everything safe for the more recent moving garbage collector.
It also supports python modules having any number of Go packages, and generates a separate .py module file for each package, which link into a single common binding library. It has been tested extensively on reproducing complex Go code in large libraries -- most stuff "just works". For example, the GoGi GUI library is fully usable from python now (do make; make install in the python directory there, and try the examples/widgets/widgets.py demo).
New features:
Callback methods from Go into Python now work: you can pass a python function to a Go function that has a function argument, and it will call the python function appropriately.The first embedded struct field (i.e., Go's version of type inheritance) is used to establish a corresponding class inheritance in the Python class wrappers, which then efficiently inherit all the methods, properties, etc.
Installation
Currently using pybindgen to generate the low-level c-to-python bindings, but support for cffi should be relatively straightforward for those using PyPy instead of CPython (pybindgen should be significantly faster for CPython apparently). You also need goimports to ensure the correct imports are included.
$ python3 -m pip install pybindgen$ go get golang.org/x/tools/cmd/goimports$ go get github.com/go-python/gopy
(This all assumes you have already installed Go itself, and added ~/go/bin to your PATH).
To install python modules, you will need the python install packages:
python3 -m pip install --upgrade setuptools wheel
Community
The go-python community can be reached out at go-python@googlegroups.com or via the web forum: go-python group. See the CONTRIBUTING guide for pointers on how to contribute to gopy.
Documentation
A presentation was given at dotgo-2015. A longer version of that talk is also available here. An article was also posted on the GopherAcademy Advent-2015.
Documentation is available on godoc: https://godoc.org/github.com/go-python/gopy
The pkg and exe commands are for end-users and create a full standalone python package that can be installed locally using make install based on the auto-generated Makefile. Theoretically these packages could be uploaded to https://pypi.org/ for wider distribution, but that would require a lot more work to handle all the different possible python versions and coordination with the Go source version, so it is much better to just do the local make install on your system. The gen and build commands are used for testing and just generate / build the raw binding files only.
Here are some (slightly enhanced) docs from the help command:
$ gopy helpgopy - Commands: pkg generate and compile Python bindings for Go, automatically including subdirs also creates all the python files needed to install module exe like pkg but makes a standalone executable with Go packages bultin this is particularly useful when using -main arg to start process on gen generate (C)Python language bindings for Go build generate and compile main thread -- python interpreter can run on another thread.Use "gopy help
Examples
From the python shell
NOTE: following not yet working in new version:
gopy comes with a little python module allowing to wrap and compile go packages directly from the python interactive shell:
>>> import gopy>>> hi = gopy.load("github.com/go-python/gopy/_examples/hi")gopy> inferring package name...gopy> loading 'github.com/go-python/gopy/_examples/hi'...gopy> importing 'github.com/go-python/gopy/_examples/hi'>>> print hi
From the command line
$ gopy build -output=out github.com/go-python/gopy/_examples/hi$ ls outhi.so$ cd out$ python3>>> import hi>>> dir(hi)['Add', 'Concat', 'Hello', 'Hi', 'NewPerson', 'Person', '__doc__', '__file__', '__name__', '__package__']>>> hi.Hello("you")hello you from go
You can also run:
go test -v -run=TestHi...
Binding generation using Docker (for cross-platform builds)
$ cd github.com/go-python/gopy/_examples/hi$ docker run --rm -v `pwd`:/go/src/in -v `pwd`:/out gopy/gopy app bind -output=/out in$ file hi.sohi.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
The docker image can also be built on local machine:
$ cd $GOPATH/src/github.com/go-python/gopy$ docker build -t go-python/gopy .$ docker run -it --rm go-python/gopy
Support Matrix
To know what features are supported on what backends, please refer to the Support matrix .
Limitations
Windows completely untested, likely needs something special.
Contribute
gopy is part of the go-python organization and licensed under BSD-3. When you want to contribute a patch or some code to gopy, please send a pull request against the gopy issue tracker AND a pull request against go-python/license adding yourself to the AUTHORS and CONTRIBUTORS files.
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~