首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将C++扩展头与package源代码分发捆绑在一起

将C++扩展头与package源代码分发捆绑在一起
EN

Stack Overflow用户
提问于 2016-09-22 18:13:08
回答 1查看 1K关注 0票数 5

我正在为一个C++库编写一个Cython包装器,我想将它作为一个package分发。我已经想出了一个虚拟版本的包,它看起来像这样(完整源代码这里)。

代码语言:javascript
复制
$ 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正确安装,并且工作正常。

代码语言:javascript
复制
from setuptools import setup, Extension
import glob

headers = list(glob.glob('inc/*.hpp'))

bogus = Extension(
    'bogus',
    sources=['bogus.pyx', 'src/bogus.cpp'],
    include_dirs=['inc/'],
    language='c++',
    extra_compile_args=['--std=c++11', '-Wno-unused-function'],
    extra_link_args=['--std=c++11'],
)

setup(
    name='bogus',
    description='Troubleshooting Python packaging and distribution',
    author='Daniel Standage',
    ext_modules=[bogus],
    install_requires=['cython'],
    version='0.1.0'
)

但是,当我使用python setup.py sdist build构建源代码发行版时,不包含C++头文件,也无法编译C++扩展名。

如何确保C++头文件与源发行版捆绑在一起?!?!

对此进行故障排除,发现了大量复杂且不一致的文档、建议和黑客,这些问题对我来说都没有用。在graft中放一条MANIFEST.in行?不是的。package_datadata_files选项?不是的。Python打包在过去的几年里似乎有了很大的改进,但是对于那些没有生存和呼吸的Python包装来说,它仍然是几乎无法通过的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-27 22:47:31

简短回答

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

长答案

基于各种博客文章和SO线程,我尝试了在MANIFEST.in文件中声明文件的建议。在这些指示之后,我向MANIFEST.in添加了一条graft inc/行,以包含整个目录。这是行不通的。

但是,用include inc/*.hpp代替这一行确实有效。可以说,这应该是我第一次尝试,但由于不熟悉setuptools和distutils的复杂和缺点,我没有理由期望graft不能工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39646097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档