Dan*_*age 5 python packaging python-extensions python-packaging
我正在为 C++ 库编写 Cython 包装器,我想将其作为 Python 包分发。我已经想出了我的包的虚拟版本,如下所示(完整源代码在这里)。
\n\n$ tree\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bogus.pyx\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 inc\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bogus.hpp\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 setup.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bogus.cpp\n$\n$ cat inc/bogus.hpp \n#ifndef BOGUS\n#define BOGUS\n\nclass bogus\n{\nprotected:\n int data;\n\npublic:\n bogus();\n int get_double(int value);\n};\n\n#endif\n$\n$ cat src/bogus.cpp \n#include "bogus.hpp"\n\nbogus::bogus() : data(0)\n{\n\n}\n\nint bogus::get_double(int value)\n{\n data = value * 2;\n return data;\n}\n$ cat bogus.pyx \n# distutils: language = c++\n# distutils: sources = src/bogus.cpp\n# cython: c_string_type=str, c_string_encoding=ascii\n\ncdef extern from \'bogus.hpp\':\n cdef cppclass bogus:\n bogus() except +\n int get_double(int value)\n\ncdef class Bogus:\n cdef bogus b\n def get_double(self, int value):\n return self.b.get_double(value)\nRun Code Online (Sandbox Code Playgroud)\n\n通过以下setup.py文件,我可以确认该库是否正确安装python setup.py install并且可以正常工作。
from setuptools import setup, Extension\nimport glob\n\nheaders = list(glob.glob(\'inc/*.hpp\'))\n\nbogus = Extension(\n \'bogus\',\n sources=[\'bogus.pyx\', \'src/bogus.cpp\'],\n include_dirs=[\'inc/\'],\n language=\'c++\',\n extra_compile_args=[\'--std=c++11\', \'-Wno-unused-function\'],\n extra_link_args=[\'--std=c++11\'],\n)\n\nsetup(\n name=\'bogus\',\n description=\'Troubleshooting Python packaging and distribution\',\n author=\'Daniel Standage\',\n ext_modules=[bogus],\n install_requires=[\'cython\'],\n version=\'0.1.0\'\n)\nRun Code Online (Sandbox Code Playgroud)\n\n但是,当我使用 构建源发行版时python setup.py sdist build,不包含 C++ 头文件,并且无法编译 C++ 扩展。
我如何确保 C++ 头文件与源代码分发捆绑在一起?!?!
\n\n<咆哮>
\n\n对此问题进行故障排除发现了极其复杂且不一致的文档、建议和黑客,但这些都对我不起作用。放一条graft线进去MANIFEST.in?没有。或package_data选项data_files?没有。在过去的几年里,Python 打包似乎有了很大的改进,但对于我们这些不熟悉 Python 打包的人来说,它仍然几乎是难以理解的!
</咆哮>
\n