如何在Python

时间:2015-07-22 06:10:01

标签: python c++ boost boost-python

我看到Web上有很多关于如何为Python编译c ++模块的信息。但问题是,几乎任何程序员都有自己的编译方式和他自己的标志列表和其他技巧。因此,考虑到各种各样的技巧,我无法决定使用哪种方法,除此之外我还有其他一些问题。这就是我试过的:

// part of main.cpp file
....
BOOST_PYTHON_MODULE( orm ){
    class_<ORM>( "ORM",
    // other code goes here
}

我的第一个问题是从长远来看我将如何在Python中包含这个模块?我应该这样做:

  import orm

或者它取决于编译过程中创建的目标文件的名称?

我的第二个问题是如何编译模块并为Python做好准备?现在我这样做:

$ g++ -I /usr/include/python2.7 -fpic -c -o main.o main.cpp

似乎应该有另一个创建共享库的额外步骤,但我不确定如何。顺便说一句,没关系,我调用了我的目标文件main.o而不是orm或者没有给它另一个名字?对于某些人来说,我的问题是如何编译,构建共享库并将其包含在Python中(我希望我可以在那里使用import orm)?

修改

如果我这样做:

// part of main.cpp

BOOST_PYTHON_MODULE( orm ){
    class_<ORM>( "ORM",
    // other code goes here
}

$ g++ -I /usr/include/python2.7 -fpic -c -o orm.os main.cpp
$ g++ -o orm.so -shared orm.os -lboost_python -lpython2.7

然后当我尝试在python中导入它时出现错误:

>>> import orm
...
ImportError: ./orm.so: undefined symbol: _ZNO3.....

那么,我做错了什么?我希望世界上至少有一个人知道答案。

修改

我又做了一次尝试:

$ g++ -fpic -shared -o orm.so main.cpp `pkg-config --cflags --libs python` -I /usr/include/python2.7

当我再做一次时:

>>> import orm

我仍然得到同样的错误undefined symbol blablabla。希望有人知道这种做法的神圣知识。

1 个答案:

答案 0 :(得分:4)

根据要求提供了一个小小的工作示例:

Function FindLastFourFridays(someDate As DateTime) As List(Of DateTime)
    'Find first Friday to include
    If someDate.DayOfWeek <> DayOfWeek.Friday Then
        someDate = someDate.AddDays(DayOfWeek.Friday - someDate.AddDays(1).DayOfWeek - 6)

        ' uncomment these two lines if you do not want initial someDate.DayOfWeek = DayOfWeek.Friday to be included
        'Else 
        '    someDate = someDate.AddDays(-7)
    End If
    'build the return (four fridays)
    Dim last4Fridays As New List(Of DateTime) From {someDate, someDate.AddDays(-7), someDate.AddDays(-14), someDate.AddDays(-21)}
    Return last4Fridays
End Function

构建命令行:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#include <boost/python.hpp>
#include <boost/python/raw_function.hpp>
#pragma GCC diagnostic pop


namespace python = boost::python;

class ORM
{
public:
  void foo(){std::cout << "foo" << std::endl;}
};

BOOST_PYTHON_MODULE(orm)
{
python::class_<ORM>("ORM")
    .def("foo", &ORM::foo)
;
}

运行python模块:

g++ -I /usr/include/python2.7 -fpic -c -o orm.o orm.cpp
g++ -o orm.so -shared orm.o -lboost_python -lpython2.7

如果尝试导入模块返回$ python Python 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import orm >>> o = orm.ORM() >>> o.foo() foo >>> 错误,那么很可能在运行时使用的库版本与用于构建python模块的库版本不同。 您可以使用undefined symbol打印共享库依赖项以查看是否一切正常,例如:ldd并检查库的路径是否与用于构建模块的路径相同。