我正在为一个C++库编写一个Cython包装器,我想将它作为一个package分发。我已经想出了一个虚拟版本的包,它看起来像这样(完整源代码这里)。
$ 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正确安装,并且工作正常。
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_data或data_files选项?不是的。Python打包在过去的几年里似乎有了很大的改进,但是对于那些没有生存和呼吸的Python包装来说,它仍然是几乎无法通过的!
发布于 2016-09-27 22:47:31
简短回答
将include inc/*.hpp放在MANIFEST.in文件中。
长答案
基于各种博客文章和SO线程,我尝试了在MANIFEST.in文件中声明文件的建议。在这些指示之后,我向MANIFEST.in添加了一条graft inc/行,以包含整个目录。这是行不通的。
但是,用include inc/*.hpp代替这一行确实有效。可以说,这应该是我第一次尝试,但由于不熟悉setuptools和distutils的复杂和缺点,我没有理由期望graft不能工作。
https://stackoverflow.com/questions/39646097
复制相似问题