Python パッケージとして配布したい C++ ライブラリの Cython ラッパーを作成しています。このようなパッケージのダミー バージョンを作成しました (完全なソースはこちら)。
$ 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 のパッケージ化に慣れていない私たちにとっては、まだほとんど理解できません。
</rant>