2017-08-12 28 views
1

我正在使用PyBind11來製作一個Python項目。在pybind11中混合Python和C++源文件

我的目錄結構看起來是這樣的:

./ 
    my_pkg/ 
    __init__.py 
    func1.py 
    func2.py 

我的C++代碼如下所示:

int myfunc(){ 
    return 1; 
} 

PYBIND11_PLUGIN(cppmodule) { 
    py::module m("cppmodule", "My cpp module"); 

    m.def("myfunc",&myfunc,"This does stuff"); 

    return m.ptr(); 
} 

而且我setup.py看起來是這樣的:

from setuptools import setup, Extension 
import glob 

ext_modules = [ 
    Extension(
    "cppmodule", 
    glob.glob('src/*.cpp'), 
    include_dirs  = ['lib/include', 'lib/pybind11/'], 
    language   = 'c++', 
    extra_compile_args = ['-std=c++17'], 
    define_macros  = [('DOCTEST_CONFIG_DISABLE',None)] 
) 
] 

setup(name = 'bob', 
    version  = '0.1', 
    description = 'A package about shrimp', 
    url   = 'http://github.com/shrimp', 
    author  = 'Bob', 
    author_email = '', 
    license  = 'MIT', 
    ext_modules = ext_modules 
) 

現在,如果我跑了

python setup.py install 

一切都編譯完成。

但是,這是奇怪的部分,後來,我可以運行import cppmodule但不是import bob。或者,與其他擺弄,有時我可以同​​時運行。

我還沒有想出什麼如何做,但我想做些什麼,是有納入bob模塊的方式func1func2將是相同的C++代碼,這樣我可以在Python類型bob.myfunc()

我該怎麼做?

+0

你嘗過'__init揭露那些功能__ py'? – krassowski

+0

@krassowski:如果我告訴安裝程序不要構建C++的東西,那麼這些函數會自動公開。我認爲兩個軟件包正在申報,而PyBind正在優先考慮。但我會很快檢查你的建議。 – Richard

回答

1

答案是修改代碼setup.py看起來像:

from setuptools import setup, Extension, find_packages 

setup(name = 'bob', 
    version  = '0.1', 
    description = 'A package about shrimp', 
    url   = 'http://github.com/shrimp', 
    author  = 'Bob', 
    author_email = '', 
    license  = 'MIT', 
    packages  = find_packages(), 
    ext_modules = ext_modules 
) 
+0

目前有同樣的問題...使用這個答案,你現在可以調用'bob.myfunc()'或者你現在安裝了兩個軟件包嗎? –

+0

@BenjaminMaier:我看到我回答的問題比我沒有那麼清楚。當我想要一個名爲'bob'的包時,我現在要做的是將pybind11代碼編譯成一個名爲'_bob'的包,然後在__init __。py'中引入'_bob'中的一些東西, bob'。 – Richard

+0

聰明!謝謝 –