5

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>

4

1 に答える 1