`
gaofen100
  • 浏览: 1243373 次
文章分类
社区版块
存档分类
最新评论

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相比,易用性还是远远不够

参考

分享到:
评论

相关推荐

    shiboken6.abi3.dll文件

    shiboken6.abi3.dll文件

    PytSide2-and-shiboken2-5.15.2.1-5.15.2.zip

    pip install shiboken2-5.15.2.1-5.15.2-cp35.cp36.cp37.cp38.cp39.cp310-none-win_amd64.whl pip install PySide2-5.15.2.1-5.15.2-cp35.cp36.cp37.cp38.cp39.cp310-none-win_amd64.whl 或者 pip install shiboken2...

    shiboken-1.2.4-2.el7.x86_64.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    shiboken25.15.2.15.15.2cp35.cp36.cp37.cp38.cp39.cp311nonewin_amd64.whl

    shiboken25.15.2.15.15.2cp35.cp36.cp37.cp38.cp39.cp311nonewin_amd64.whl

    PySide6-6.2.3-6.2.3-cp36.cp37.cp38.cp39.cp310-none-win_amd64

    pysides 在线下载较慢,共享 需要安装shiboken6 python -m pip install shiboken6==shiboken6-6.2.3

    shiboken-libs-1.2.4-2.el7.x86_64.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    shiboken-devel-1.2.4-2.el7.x86_64.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    samplebinding.rar

    《Python调用C++:基于Shiboken与PySide的深度探索》 在现代软件开发中,跨语言交互已经成为一种常见的需求。Python以其简洁的语法和丰富的库支持,被广泛用于编写脚本和快速原型设计,而C++则以其高效性能和底层...

    makelib2.rar

    为了在Python中使用Qt库,通常会借助于Shiboken和PySide模块,这两个模块能够将Qt的C++接口转换为Python可用的形式。 标题中的"makelib2.rar"可能是一个包含源代码和构建脚本的压缩包,用于演示如何将一个简单的Qt...

    pyside-pyside-setup

    相同的setup.py脚本用于构建项目的所有组件: shiboken6(支持的Python模块) shiboken6-generator(绑定生成可执行文件) PySide6 最好使用Qt(构建)环境来自动选择关联的qmake ,但可选地,如果qmake和cmake不在...

    PyQtRPT:Pyside QtRPT-开源

    用于QtRPT的Pyside QtRPT Python绑定(PySide Shiboken)QtRPT报告引擎Python报告许可证与QtRPT兼容的LGPL3(请参阅许可证)“”“ QtRPT是用C ++ QtToolkit编写的易于使用的打印报告引擎。它允许将多个报告合并为一...

    Pyside2 aarch64,Python3.8

    适用于linux系统(ubuntu)等,架构aarch64,直接使用Pyside2 代替Qt,做项目时候直接安装编译好的文件即可,先安装shiboken的两个文件,最后安装Pyside2. 一般Qt的安装很不容易安装成功,尤其是对于ubuntu系统,...

    Pyside2 aarch64,Python3.6

    适用于linux系统(ubuntu)等,架构aarch64,直接使用Pyside2 代替Qt,做项目时候直接安装编译好的文件即可,先安装shiboken的两个文件,最后安装Pyside2. 一般Qt的安装很不容易安装成功,尤其是对于ubuntu系统,...

    Pyside2 aarch64,Python3.7

    适用于linux系统(ubuntu)等,架构aarch64,直接使用Pyside2 代替Qt,做项目时候直接安装编译好的文件即可,先安装shiboken的两个文件,最后安装Pyside2. 一般Qt的安装很不容易安装成功,尤其是对于ubuntu系统,...

    PyQt5-5.15.2-5.15.2-cp35.cp36.cp37.cp38.cp39-none-win_amd64.whl

    PyQt5-5.15.2-5.15.2-cp35.cp36.cp37.cp38.cp39-none-win_amd64.whl

    PyQt5-5.15.0-5.15.0-cp35.cp36.cp37.cp38-none-win_amd64.whl

    PyQt5-5.12.1-5.12.2-cp35.cp36.cp37.cp38-none-win_amd64.whl

    pyside2-setup:注意力

    Qt对于Python Qt For Python是,可访问完整的Qt 5.x框架以及用于快速生成任何C ++库绑定的生成器工具。... shiboken2是用于构建绑定的生成器。 有关详细信息,请参见README.pyside2.md和README.shiboken2.md。

    PyQtSerialPort:PySide QtSerialPort-开源

    PySide QtSerialPort绑定Shiboken LGPL3 QtSerialPort是Qt的正式组成部分(http://www.qt.io)。 信息链接:http://wiki.qt.io/QtSerialPort

    Import-Browser:使用Python PyQt5编写的Internet浏览器

    适用于Python的Qt Qt for Python提供了Qt的官方Python绑定,并具有两个主要组件: PySide6,以便您可以在Python应用程序中使用Qt6 API,还可以使用Shiboken6(一个绑定生成器工具,可以将C ++项目暴露给Python),...

    PythonDemo.rar

    2. **PyQt/PySide集成**:在Python中,开发者会使用`uic`模块(对于PyQt)或`shiboken2`和`PyQt5.QtWidgets`(对于PySide)来加载.ui文件,并将其转换为可执行的Python类。这样,可以在Python脚本中实例化这些类,...

Global site tag (gtag.js) - Google Analytics