Shiboken入门练习

终于弄清楚shiboken怎么用了,可是距离学习使用Python调用C模块 已经过了10个月时间。

不管怎样,第一个例子,还是需要完整记录一下,备忘。

(注意:本文只是windows下使用shiboken的一个尝试,正常使用参考:使用Shiboken为C++和Qt库创建Python绑定 )

生成C++动态库

写个很简单的类:

+-- libfoo/
|      |-- foo.h
|      |-- foo.cpp
|      `-- foo.pro
  • foo.h内容如下:
#ifndef FOO_H
#define FOO_H

#if defined _WIN32
    #if LIBFOO_BUILD
        #define LIBFOO_API __declspec(dllexport)
    #else
        #define LIBFOO_API __declspec(dllimport)
    #endif
#else
    #define LIBFOO_API
#endif

class LIBFOO_API Math
{
public:
    Math(){}
    ~Math(){}
    int squared(int x);
};

#endif // FOO_H
  • foo.cpp 内容如下:
#include "foo.h"

int Math::squared(int x)
{
    return x * x;
}
  • 使用qmake来管理工程,对应的foo.pro 如下
TEMPLATE = lib
TARGET = foo
HEADERS += foo.h
SOURCES += foo.cpp

DEFINES += LIBFOO_BUILD

运行 qmake 和 nmake 生成 foo.lib 和 foo.dll

生成胶水文件

需要准备的文件:

+-- foobinding/
|      |-- global.h
|      `-- typesystem_foo.xml
  • global.h 包含要提取的接口的头文件
#include "foo.h"
  • typesystem_foo.xml 包含要提取的信息
<?xml version="1.0"?>
<typesystem package="foo">
    <primitive-type name="int"/>
    <value-type name='Math'/>
</typesystem>

包的名字取为foo,要导出的类为Math,类中用到了 int 这一个基本类型。

  • 然后在该目录下运行shiboken(生成胶水代码):
shiboken global.h --include-paths=../libfoo typesystem_foo.xml --output-directory=.

由于我们的 foo.h 不在该目录下,故需要指定其所在目录(--include-paths)。

在当前目录下,最终将生成以下文件:

  • foo/foo_python.h
  • foo/foo_module_wrapper.cpp
  • foo/math_wrapper.h
  • foo/math_wrapper.cpp

胶水代码生成以后,我们就可以调用编译器进行编译:

编译胶水文件

+-- libfoo/
|      |-- foo.h
|      |-- foo.cpp
|      |-- foo.pro
|      |-- foo.dll
|      `-- foo.lib       
|
+-- foobinding/
|      |-- global.h
|      |-- typesystem_foo.xml
|      |
|      +---foo/
|            |-- foo_python.h 
|            |-- foo_module_wrapper.cpp
|            |-- math_wrapper.h
|            `-- math_wrapper.cpp

首先看看编译这几个胶水文件需要哪些东西:

 

头文件路径

库文件

python

 

python27.lib

shiboken

 

shiboken-python2.lib

foo

 

foo.lib

直接调用MSVC的编译器进行编译:

cl /EHsc /LD foo/foo_module_wrapper.cpp foo/math_wrapper.cpp /ID:/python27/include /ID:/shiboken/dist/include/shiboken /I../libfoo /Fefoo.pyd  /link /LIBPATH:D:/python27/libs /LIBPATH:D:/shiboken/dist/lib /LIBPATH:../libfoo/release shiboken-python2.7.lib python27.lib foo.lib

生成 foo.pyd

测试

编译一个Python程序测试看看:

# -*- coding: utf-8 -*-

import unittest
import foo

class MathTest(unittest.TestCase):
    def testMath(self):
        '''Test case for Math class from foo module.'''
        val = 5
        math = foo.Math()
        self.assertEqual(math.squared(5), 5 * 5)
 
if __name__ == '__main__':
    unittest.main()

恩一切正常。

至此,已经全手动的过了一遍,如果要自动化,看来还是要继续好好学习cmake才行。

顺便抱怨一下,PySide 的 shiboken 和PyQt4的sip相比,易用性还是远远不够

参考

 

<think>我们正在解决用户关于手动下载安装Shiboken6的问题。根据引用[1]和引用[2],用户遇到了与Shiboken相关的DLL加载失败问题。用户可能希望独立安装Shiboken6以解决PySide6的依赖问题。 步骤: 1. 确定Shiboken6的作用:Shiboken6是PySide6的绑定生成工具和核心依赖库,用于在Python和C++/Qt之间建立桥梁。 2. 下载地址:Shiboken6可以在PyPI上找到,或者从Qt官方镜像下载。 3. 手动安装方法:下载对应的wheel文件,然后使用pip安装。 详细流程: 一、卸载现有的PySide6和Shiboken6(如果之前安装过) 二、下载Shiboken6的wheel文件 三、安装Shiboken6 四、验证安装 注意:Shiboken6的版本必须与后续安装的PySide6版本严格匹配。 具体步骤: 1. 卸载现有相关包(如果之前安装过): pip uninstall PySide6 shiboken6 2. 访问Shiboken6的PyPI页面:https://pypi.org/project/shiboken6/#files 根据你的Python版本和操作系统下载对应的wheel文件。例如: Python 3.11, Windows 64位:shiboken6-6.6.0-cp311-cp311-win_amd64.whl Python 3.10, Linux 64位:shiboken6-6.6.0-cp310-cp310-manylinux_2_28_x86_64.whl 3. 安装wheel文件: 打开命令行,进入下载目录,执行: pip install shiboken6-<version>.whl 4. 验证Shiboken6安装: 在Python中执行: import shiboken6 print(shiboken6.__version__) 5. 安装PySide6(同样需要手动下载匹配版本的wheel文件): 从https://pypi.org/project/PySide6/#files下载与Shiboken6相同版本的PySide6 wheel文件,然后安装: pip install PySide6-<version>.whl 注意:如果用户只关心Shiboken6的独立安装(比如用于生成绑定),那么安装完Shiboken6后即可使用。但如果是为了支持PySide6,则必须安装相同版本的PySide6。 环境配置: 安装完成后,通常不需要额外的环境配置,因为wheel安装会将二进制文件放在Python的site-packages目录下。但是,如果遇到动态库加载问题(如DLL找不到),请检查: - 系统PATH是否包含Python的安装目录(以及Scripts目录) - 确保没有多个Python环境冲突 引用说明: 根据引用[1]和引用[2],DLL加载失败可能是由于版本不匹配或环境变量配置问题。手动安装匹配版本通常可以解决。 相关问题: 1. 如何验证Shiboken6是否安装成功? 2. 安装Shiboken6后,为什么在导入时仍然出现DLL加载错误? 3. 如何为特定的Python版本安装Shiboken6? 4. Shiboken6和PySide6版本不匹配会导致什么问题? 5. 如何编译自己的Shiboken6? 注意:用户可能不需要编译自己的Shiboken6,因此我们只提供预编译版本的安装指导。</think>### Shiboken6 手动下载与安装指南 Shiboken6 是 PySide6 的核心依赖库,负责 Python 与 C++/Qt 之间的绑定。以下是详细的手动安装流程: #### 📥 下载地址 1. **官方 PyPI 页面**: - [Shiboken6 下载页](https://pypi.org/project/shiboken6/#files) 2. **选择匹配系统的版本**: ```markdown - Windows 示例: `shiboken6-6.6.0-cp311-win_amd64.whl` - Linux 示例: `shiboken6-6.6.0-cp311-manylinux_2_28_x86_64.whl` - macOS 示例: `shiboken6-6.6.0-cp311-macosx_11_0_universal2.whl` ``` **关键标识**: - `cp311` → Python 3.11(需与你的 Python 版本匹配) - `win_amd64` → 64位 Windows - `manylinux` → Linux 兼容版本 #### 📦 手动安装步骤 ```bash # 1. 卸载现有版本(如有) pip uninstall shiboken6 # 2. 进入下载目录 cd /path/to/downloads # 3. 安装 .whl 文件 pip install shiboken6-*.whl # 4. 验证安装 python -c "import shiboken6; print(f'Success! Version: {shiboken6.__version__}')" ``` #### ⚙️ 环境配置要点 1. **DLL 加载问题解决**(针对引用[1][2]的错误): ```ini [Windows 解决方案] - 安装 Microsoft Visual C++ 可再发行组件: https://aka.ms/vs/17/release/vc_redist.x64.exe - 添加 Python 安装目录到 PATH: C:\Python311\ 和 C:\Python311\Scripts\ ``` 2. **关键路径配置**: ```markdown | 环境变量 | 路径示例 | 作用 | |----------------|-----------------------------------|----------------------| | `PATH` | C:\Python311\Lib\site-packages | 基础库路径 | | `PYTHONPATH` | D:\custom_libs\ | 自定义库路径 | | `QT_PLUGIN_PATH` | ...\shiboken6\bin | 解决组件加载问题[^1] | ``` #### 🔍 安装验证代码 ```python import shiboken6 from shiboken6 import Shiboken # 验证核心功能 print("Shiboken6 版本:", shiboken6.__version__) print("Shiboken 模块:", Shiboken) # 检查二进制路径 import os print("DLL 路径:", os.path.dirname(shiboken6.__file__)) ``` #### ⚠️ 注意事项 1. **版本匹配原则**: - Shiboken6 版本必须与 PySide6 **严格一致** - Python 版本必须与 `.whl` 的 `cp` 标识匹配 - 示例:PySide6-6.6.0 需搭配 shiboken6-6.6.0 2. **常见错误解决方案**: - **ImportError: DLL load failed**: - 安装 VC++ 运行库[^1] - 检查 Python 环境变量配置[^2] - **Linux/Mac 缺失依赖**: ```bash # Ubuntu sudo apt install libgl1-mesa-dev libxcb-xinerama0 ``` 3. **手动编译说明**(仅限高级用户): 参考引用[3]的编译命令: ```bash cl /EHsc /LD ... /link /LIBPATH:... shiboken-python3.11.lib ``` 需安装 Qt SDK 和 Shiboken 源码: ```bash git clone https://code.qt.io/pyside/shiboken.git cmake -B build -DCMAKE_INSTALL_PREFIX=/custom/path cmake --build build --target install ``` #### 🌐 相关问题 1. 如何解决 `ImportError: DLL load failed while importing Shiboken` 错误? 2. Shiboken6 与 PySide6 版本不匹配会导致什么问题? 3. 在 Linux 系统安装 Shiboken6 需要哪些依赖库? 4. 如何为多个 Python 版本安装兼容的 Shiboken6? 5. 手动编译 Shiboken6 需要哪些前置工具和配置? 6. PySide6 应用打包时如何处理 Shiboken6 依赖? > 提示:安装完成后,建议使用相同版本的 PySide6 wheel 文件安装 Qt 绑定。定期更新:`pip install --upgrade shiboken6 PySide6`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值