Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
包装C++;使用python编写代码(手动)_Python_C++_Wrapper - Fatal编程技术网

包装C++;使用python编写代码(手动)

包装C++;使用python编写代码(手动),python,c++,wrapper,Python,C++,Wrapper,我有一个主文件(main.cpp)和一个头文件(nodes.hpp)。主文件将N(任何正整数)作为输入参数,并使用头文件的函数给出输出,例如“x&y”(双精度) 注意: 主文件和头文件都是用C++编写的。 主文件和头文件都使用特征库,而不是使用数据结构作为数组、向量 我必须为他们编写一个python包装器,我有python的实用知识,但从未使用过任何包装器 任何人都可以参考或给出一些关于使用python wrpper编写此类代码的说明吗 尝试使用官方文档: 此链接将为您提供如何包含cpp模块并

我有一个主文件(main.cpp)和一个头文件(nodes.hpp)。主文件将N(任何正整数)作为输入参数,并使用头文件的函数给出输出,例如“x&y”(双精度)

注意:

主文件和头文件都是用C++编写的。
  • 主文件和头文件都使用特征库,而不是使用数据结构作为数组、向量
  • 我必须为他们编写一个python包装器,我有python的实用知识,但从未使用过任何包装器


    任何人都可以参考或给出一些关于使用python wrpper编写此类代码的说明吗

    尝试使用官方文档:

    此链接将为您提供如何包含cpp模块并从python解释器中使用它的简单示例,或者如果可能,请尝试使用Cython:

    Cython将允许您编写类似C、Python的代码,这些代码将被翻译为CPP编译,然后可以从Python轻松访问。

    您可以使用

    或者使用Python


    如果您已经设置了Boost,我建议您使用Boost.Python

    使用Boost.Python。这是我的教程,前面是SO文档


    使用Boost.Python

    当Python项目中必须使用C++库时,事情就变得简单了。你可以使用Boost

    首先,这里列出了您需要的组件:

    • 一个CMakeList.txt文件,因为您将要使用CMake
    • C++项目的C++文件。
    • python文件-这是您的python项目
    让我们从一个小C++文件开始。我们的C++项目只有一个方法返回一些字符串“这是第一次尝试”。称之为CppProject.cpp

    在下面有一个CMakeLists.txt文件:

    cmake_minimum_required(VERSION 2.8.3)
    FIND_PACKAGE(PythonInterp)
    FIND_PACKAGE(PythonLibs)
    FIND_PACKAGE(Boost COMPONENTS python)
    
    INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})
    
    PYTHON_ADD_MODULE(NativeLib CppProject)
    FILE(COPY MyProject.py DESTINATION .) # See the whole tutorial to understand this line
    
    通过本教程的这一部分,一切都很简单。您可以在python项目中导入库和调用方法。调用python项目MyProject.py


    要运行项目,请遵循以下说明:

    • 创建一个名为build的目录
    • 进入那个目录
    • 发出命令
      cmake-DCMAKE\u BUILD\u TYPE=Release..
    • make
    • python MyProject.py
      。现在,您必须看到C++项目中方法返回的字符串。
      • 以下是您的选择:

        >p>您可以使用,并且我认为这是最干净的解决方案,因为您将程序转换为可以由任何其他软件调用的共享库,而不只是Python。不过,您必须自己为程序编写一个C接口

        >p>您可以使用,并且我认为这是最坏的解决方案,因为它的级别很低,并且容易出现内存泄漏,并且花费大量的时间来实现一个函数,并且依赖于Python版本。基本上,在C++内部启动Python解释器是很好的。您可以创建PyObjects(它是任何Python类型的主要构建块)并在C/C++中处理它们

      • 您可以使用,其中它会自动创建必须通过您定义的接口文件使用ctypes创建的接口。人们说它很好,但是文档没有那么好

      • 您可以使用,这很好,但它有一个非常丑陋的bjam构建系统。如果您能够设法绕过它,那么它甚至比ctypes更好。我是个超级助推器迷,但bjam是我不使用这个的原因


      • 我通常做的是ctypes。我相信它,因为它强调了。该库有一个与接口(C接口)分开的工作,它也与使用该接口的Python脚本分离,并向用户公开“简单的功能”。

        < P> C++包生成的另一个工具是。谷歌于2017年发布了这一版本,目前它在所有方面都使用这一版本。我们不再允许在内部为Python编写新的SWIG包装器


        它是在C++的基础上构建的C++解析,需要相对地道的现代C++ API使用(毫不奇怪的跟随),而不是任何尝试允许你通过SWIG的“支持一切糟糕”的方法在脚上开枪。其中还提到了一些你可以研究的第三方工具。其中一个最好、最现代的libs是(它每天都越来越流行)。没有太多的经验,除了cython,这是我唯一尝试过的,效果很好。Python通常被认为比SWIG和co更易于使用,但它受到Boost构建工具的限制。这是PybDun11摆脱的,如果你能够使用现代C++编译器!缺少#include boost/python.hpp

        cmake_minimum_required(VERSION 2.8.3)
        FIND_PACKAGE(PythonInterp)
        FIND_PACKAGE(PythonLibs)
        FIND_PACKAGE(Boost COMPONENTS python)
        
        INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})
        
        PYTHON_ADD_MODULE(NativeLib CppProject)
        FILE(COPY MyProject.py DESTINATION .) # See the whole tutorial to understand this line
        
        import NativeLib
        print (NativeLib.getTryString)