Windows安装go-python环境--使用golang执行python3

2023-05-16

Windows安装go-python环境

  • 目的
  • 项目路径
  • 安装python3.7.9
    • 安装包
    • 便携版
  • 安装pkg-config
  • 新增PC文件
  • 安装TMD-GCC
  • 添加环境变量
  • 安装go-python
  • 测试
  • 不兼容接口

目的

在go中使用C API调用CPython库,从而可以进行Python语法调用。可用pip安装库,然后go语言可直接访问python方法。

项目路径

本文使用python3 版本
github.com/go-python/cpy3

附: python2版本
github.com/go-python/cpy2

安装python3.7.9

安装包

下载python3.7.9
选择自定义安装,安装所有组件
安装路径设置为C:/Python37

便携版

喜欢用便携版的可以参照这里安装便携版
然后从安装版中拷贝include到便携版目录中即可.
include目录是pkg-config的前置条件.

安装pkg-config

先安装choco

使用命令安装pkg-config

choco install pkgconfiglite

新增PC文件

如下路径新增文件
%USERPROFILE%\.pkgconfig\python3.pc

PYTHTON_HOME=C:/Python37
lib=${PYTHTON_HOME}
include=${PYTHTON_HOME}/include

Name: Python
Description: Python library 
Requires:
Version: 3.7
Libs: -L${lib} -lpython37 -lpthread -lm
Cflags: -I${include} -DMS_WIN64

安装TMD-GCC

下载TMD-GCC并安装
官网地址

添加环境变量

设置pkg_config环境变量

setx PKG_CONFIG_LIBDIR %USERPROFILE%\.pkg-config

或者

setx PKG_CONFIG_PATH %USERPROFILE%\.pkg-config

设置Go环境变量

setx GOOS windows
setx GOARCH amd64
setx CGO_ENABLED 1
setx GO111MODULE auto

如果是vscode,在setting.json中添加,否则语法提示无法正常工作

{
    "go.toolsEnvVars": {
        "GOOS": "windows",
        "GOARCH": "amd64",
        "CGO_ENABLED": "1",
        "GO111MODULE": "auto",
    }
}

安装go-python

go get -v github.com/go-python/cpy3

测试

python3版本的API和python2版本的API略有区别。修正后的测试程序

package main

import (
	"fmt"

	python3 "github.com/go-python/cpy3"
)

func main() {
	python3.Py_Initialize()
	gostr := "foo"
	bytes := python3.PyBytes_FromString(gostr)
	str := python3.PyBytes_AsString(bytes)
	fmt.Println("hello [", str, "]")
}

显示

hello [ foo ]

不兼容接口

官网文档指明:Windows下File的结构可能因为链接库的不同而不同。
由于Python3在windows上是MSVC的,而golang并不支持MSVC,从而使用了TMD-GCC来兼容。这样File
肯定不一样。则PyRun_AnyFile 不可使用。
在这里插入图片描述
Py_Main() 则需要额外多传递一个参数。这个非File*指针所致,操作系统区别而已。
使用示例

package main

import (
	"fmt"
	"log"
	"os"

	python3 "github.com/go-python/cpy3"
)

func main() {
	defer python3.Py_Finalize()
	python3.Py_Initialize()

	cwd, err := os.Getwd()
	if err != nil {
		log.Panic(err)
	}
	code := python3.PyRun_SimpleString(fmt.Sprintf(`
import sys
sys.path.append(r"%s")
`, cwd))
	if code != 0 {
		log.Panic(fmt.Errorf("call `PyRun_SimpleString` error"))
	}
	f, err := os.Create("test.py")
	if err != nil {
		panic(err)
	}
	defer func() {
		if err := f.Close(); err != nil {
			panic(err)
		}
	}()
	if _, err := f.WriteString(`
print("test")
	`); err != nil {
		panic(err)
	}
	code, err = python3.Py_Main([]string{"python", "test.py"})
	if err != nil {
		panic(err)
	}
	if code != 0 {
		log.Panic(fmt.Errorf("call `Py_Main` error"))
	}
}

由于CPython API的原因没有AP可以对sys.path进行直接的操作,只能通过执行String的模式来更改

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows安装go-python环境--使用golang执行python3 的相关文章

  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • NodeJS Express Windows 最大连接数设置

    在哪里设置nodejs的最大连接数 用于使用express get 在 Windows 10 中 与linux中的最大文件 描述符 设置有关吗 有该设置的 Windows 版本吗 最好是在nodejs中进行设置 以便在迁移到unix时兼容
  • 为 Anaconda Python 安装 psycopg2

    我有 Anaconda Python 3 4 但是每当我运行旧代码时 我都会通过输入 source activate python2 切换到 Anaconda Python 2 7 我的问题是我为 Anaconda Python 3 4 安
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • PyUSB 1.0:NotImplementedError:此平台不支持或未实现操作

    我刚刚开始使用 pyusb 基本上我正在玩示例代码here https github com walac pyusb blob master docs tutorial rst 我使用的是 Windows 7 64 位 并从以下地址下载 z
  • 以编程方式停止Python脚本的执行? [复制]

    这个问题在这里已经有答案了 是否可以使用命令在任意行停止执行 python 脚本 Like some code quit quit at this point some more code that s not executed sys e
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • 如何使用Python创建历史时间线

    So I ve seen a few answers on here that helped a bit but my dataset is larger than the ones that have been answered prev
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • Scrapy:如何使用元在方法之间传递项目

    我是 scrapy 和 python 的新手 我试图将 parse quotes 中的项目 item author 传递给下一个解析方法 parse bio 我尝试了 request meta 和 response meta 方法 如 sc
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • Windows 目录永远不会包含临时文件的非 ASCII 字符?

    在 Windows 上使用 MinGW 7 3 0 由于 Windows 限制 Hunspell 无法从包含非 ASCII 字符的位置加载字典文件 我已经尝试了所有方法 1 现在我将文件复制到没有 ASCII 字符的路径 然后再将其交给 H

随机推荐

  • 关于查看ros中可以安装的功能包

    可以通过以下命令查看软件库中是否包含你所需要的功能包 apt cache search xxxx 其中xxx为你要搜索的关键字
  • 教你如何用原生css和html搭建一个好看的Table表格

    前言 大家在学习 lt table gt 标签的时候 xff0c 可能还没有接触css xff0c 所以你做出来的表格可能是这样的 xff1a 或者是这样的 xff1a 大家有想过自己做一个漂亮的表格吗 xff1f 我知道大家在做项目的时候
  • 如何在 Ubuntu 20.04 启用 SSH

    简介 xff1a Secure Shell SSH 是一个网络协议 xff0c 它主要被用来加密客户端和服务端之间的连接 在客户端和服务端的每一次交互都被加密 本文主要为大家讲解如何在 Ubuntu 20 04 启用 SSH 镜像下载 域名
  • 树莓派镜像SD卡烧录成功磁盘没内容解决方法

    这个情况很可能是删除分区后发生的 xff0c 只需要此电脑 管理 磁盘管理 驱动器路径 添加 确定就可以解决了
  • C++ 类学习总结(五) 继承与多态

    继承 基本概念 xff0e 基类 xff1a 可供其他类继承的类 xff0c 基类的成员也将成为派生类的成员 xff0e 派生类 xff1a 从基类继承而来的类 xff0c 称为派生类 xff0e 虚函数 xff1a 基类中希望其派生类可以
  • 行业术语 英文

    IDE 一般指集成开发的环境 如QT Creator Visual Studio等 Application framework 一般指的是应用程序框架 xff08 包含 XML xff0c GUI组件 xff0c 程序 xff0c 网络框架
  • VSCode C/C++ 格式化配置【最完整准确版本】

    一 下载Clang format 1 在VSCode插件商店下载 C C 43 43 插件 和 Clang format 插件 二 生成 clang format 文件 2 去到 C Users lt 你的用户名 gt vscode ext
  • 【时间规划】C/C++发展之路--读书

    0 xff1a 图书馆的N本C xff0c C 43 43 书 1 xff1a C语言深度解剖 2 xff1a 高质量C 43 43 c编程指南 3 xff1a C 43 43 primer第四版 4 xff1a Windows程序设计 5
  • 【Cocos2d-x】Win7+ vs2012,2010 + Cocos2d-x2.2 配置Cocos2d-X项目-环境

    新安装搭建cocos2d X的跳过这里 xff0c 看下面红色开始 xff1a cocos2d x删除vs2012项目模板 这一步新使用cocos2d x的不需要 如果你切换cocos2d x版本的话 xff0c 要将之前版本的vs模板删除
  • 【Cocos2d-x】Cocos2d-x参考案例源码解析之一:Cocos2dx各个文件说明

    这里本人电脑配置是win7 64位 xff0c cocos2d x2 20 xff0c VS2012 1 xff1a 首先当然是下载cocos2d x啦 我采用的是2 20版本 说明 xff1a 2 14以后的版本和之前的VS模板生成和环境
  • 【Cocos2d-x】Cocos2d-x参考案例源码解析之三:HelloWorld

    允许我讲些与源码无关的事情 xff01 稍后K我 由于cocos2dX3 0快出来了 xff0c 官网上说放弃objective c风格 xff0c 本屌学的是C 43 43 xff0c 所以真是太高兴了 xff0c 所以放慢的源码解析 x
  • 【Cocos2d-x】Cocos2d-x跨Android平台搭建之四:Win7 64位+ eclipse + cocos2dX

    开始研究cocos2dx xff0c mark一下这个的配置步骤 1 下载eclipse 2 下载android sdk xff0c 配置sdk路径 xff0c 添加环境变量 3 安装adt 4 下载android ndk xff0c 配置
  • 【网络通信】Wince 和 PC 通过USB 用Socket 进行通信

    网上资料比较少或者说讲的不太详细 xff0c 现在进行总结下 xff0c 刚毕业没接触过WINce xff0c 不过和MFC差不多 xff0c 现在进入正题 刚开始我的疑惑是Wince是如何和PC进行通信的 xff0c 以及能在USB模式下
  • 如何在 Ubuntu 20.04 上添加交换空间

    简介 xff1a 本文主要为大家讲解如何在 Ubuntu 20 04上添加并激活一个交换空间 镜像下载 域名解析 时间同步请点击 阿里巴巴开源镜像站 交换空间是硬盘上的一个空间 xff0c 当物理 RAM 内存被用尽时 xff0c 被紧急征
  • VScode+Sphinx+ReadTheDocs 从环境搭建到放弃

    概述 此篇博客用来记录在windows10中配置环境的过程 xff0c 注意是Windows下 xff0c 我没有在Linux下面尝试过配置 一下参考了各路教程加上自己亲测 xff0c 应该是没有问题的 被掏空 目录 概述 目录材料清单工具
  • 分布式游戏服务器设计

    分布式游戏服务器设计 服务器解释整体设计图网关服务器网络连接消息处理权限管理业务支持消息路由 登录服务器网络连接用户注册用户登录 中心服务器用户管理消息推送全局功能 游戏服务器数据读取数据落地消息处理 存储服务器工作模式数据一致性 依赖系统
  • Ubuntu 更新apt源及apt常用命令

    Ubuntu 更新apt源及常用命令 替换apt国内源更新软件包信息可更新的包信息更新所有包安装编译必备安装软件包查找软件包名查找包含文件的软件包名列出软件包的所有文件删除软件包 替换apt国内源 执行以下命令 span class tok
  • UUID/GUID介绍、生成规则及生成代码

    UUID GUID介绍 生成规则及生成代码 1 UUID介绍1 1 介绍1 2 UUID优势1 3 UUID劣势 2 UUID版本2 1 版本1 基于时间的UUID2 1 1优点2 1 2 缺点2 1 3 生成规则 2 2 版本2 分布式安
  • Linux开启root远程密码ssh登录

    Linux开启root远程密码ssh登录 登录修改root密码登录root修改sshd配置重启sshd服务 登录 先使用pubkey登录到普通用户 修改root密码 然后执行以下命令更新root密码 span class token fun
  • Windows安装go-python环境--使用golang执行python3

    Windows安装go python环境 目的项目路径安装python3 7 9安装包便携版 安装pkg config新增PC文件安装TMD GCC添加环境变量安装go python测试不兼容接口 目的 在go中使用C API调用CPyth