13

我有以下目录布局

awesome_package
\- module1.py
\- build
   \- module2.so

我目前将 module1 导入为

import awesome_package.module1

和模块2作为

import sys
sys.path.append('path/to/awesome_package/build')
import module2

但我希望能够使用前一种语法。

module2 由 pybind11 以如下方式创建:

PYBIND11_MODULE(module2, module2) {
    module2.doc() = "C++ module wrapped for Python";
    module2.def("some_cpp_function", some_cpp_function) 
}
4

1 回答 1

6

正如我在评论中所说,二进制 Python 模块通常使用distutils/构建setuptools。为此,您需要编写setup.py包含所有必要选项的脚本。下面是一个非常简单的示例,仅显示基本内容:

from setuptools import setup, Extension

setup(
    name = 'awesome',
    version = '0.0.1',
    packages = ['awesome_package']                     
    ext_modules = [Extension(
       'awesome_package.module2',
       ['src/module2.cpp']
    )]
)

自然,setup.py您需要指定所有构建选项,如头文件、编译器标志等。

如果您坚持使用 CMake,则需要添加自定义复制命令,将您编译的模块复制到您的包中。像这样的东西:

add_custom_command(TARGET module2 POST_BUILD
       COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:module2>
       "${CMAKE_SOURCE_DIR}/awesome_package"
    )
于 2017-08-19T07:51:46.613 回答