用Python包源分发绑定C++扩展头

2024-04-26 02:54:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个Cython包装器,我想把它作为一个Python包分发给C++库。我已经为我的包设计了一个类似这样的虚拟版本(完整源代码here)。在

$ tree
.
├── bogus.pyx
├── inc
│   └── bogus.hpp
├── setup.py
└── src
    └── bogus.cpp
$
$ cat inc/bogus.hpp 
#ifndef BOGUS
#define BOGUS

class bogus
{
protected:
    int data;

public:
    bogus();
    int get_double(int value);
};

#endif
$
$ cat src/bogus.cpp 
#include "bogus.hpp"

bogus::bogus() : data(0)
{

}

int bogus::get_double(int value)
{
    data = value * 2;
    return data;
}
$ cat bogus.pyx 
# distutils: language = c++
# distutils: sources = src/bogus.cpp
# cython: c_string_type=str, c_string_encoding=ascii

cdef extern from 'bogus.hpp':
    cdef cppclass bogus:
        bogus() except +
        int get_double(int value)

cdef class Bogus:
    cdef bogus b
    def get_double(self, int value):
        return self.b.get_double(value)

通过下面的setup.py文件,我可以确认库是否正确地安装了python setup.py install,并且工作正常。在

^{pr2}$ <>但是,当我使用^ {CD3>}构建源分布时,C++的头文件不包含,并且C++扩展无法编译。在

<>强>如何确保C++头文件与源分布绑定?!?!!

<;兰特>

对此进行故障排除后发现了一个极其复杂且不一致的文档、建议和黑客攻击,这些都不适合我。在graft行中放入MANIFEST.in?不。package_data或{}选项?不。Python打包在过去的几年里似乎有了很大的改进,但是对于我们这些不喜欢Python打包的人来说,它仍然是几乎无法穿透的!在

<;/rant>


Tags: pysrcdatagetvaluesetupcppcat
1条回答
网友
1楼 · 发布于 2024-04-26 02:54:48

简短回答

include inc/*.hpp放入MANIFEST.in文件中。在

冗长的回答

基于各种博客文章和其他帖子,我尝试过在MANIFEST.in文件中声明文件的建议。在these instructions之后,我向graft inc/添加了一个graft inc/行,以包含整个目录。这没用。在

但是,用include inc/*.hpp替换这一行确实有效。可以说这应该是我尝试的第一件事,但是由于不熟悉setuptools和distutil的复杂性和缺点,我没有理由期望graft不会起作用。在

相关问题 更多 >

    热门问题