Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我是否需要为Boost.Python定义一个PyMODINIT_FUNC来公开一个C++;上课?_C++_Python_Boost - Fatal编程技术网

C++ 我是否需要为Boost.Python定义一个PyMODINIT_FUNC来公开一个C++;上课?

C++ 我是否需要为Boost.Python定义一个PyMODINIT_FUNC来公开一个C++;上课?,c++,python,boost,C++,Python,Boost,我已经通过Ubuntu安装了libboost。升级版是1.42。 我遵循了Boost网站上的示例: #include <string> struct World { void set(std::string msg) { this->msg = msg; } std::string greet() { return msg; } std::string msg; }; 但我不是Boost。Python应该创建这个吗?是否正在生成函数,但未找到?还是我

我已经通过Ubuntu安装了libboost。升级版是1.42。 我遵循了Boost网站上的示例:

#include <string>

struct World
{
    void set(std::string msg) { this->msg = msg; }
    std::string greet() { return msg; }
    std::string msg;
};
但我不是Boost。Python应该创建这个吗?是否正在生成函数,但未找到?还是我需要自己写

我知道它确实试图导入生成的模块,因为它在从另一个目录执行时会给出不同的错误

jsnavely@jsnavely-OptiPlex-980:~/Dropbox/flycap/pytest$ bjam
...found 10 targets...
...updating 5 targets...
MkDir1 bin
MkDir1 bin/gcc-4.5.2
MkDir1 bin/gcc-4.5.2/debug
gcc.compile.c++ bin/gcc-4.5.2/debug/world.o
gcc.link.dll bin/gcc-4.5.2/debug/world.so
...updated 5 targets...
jsnavely@jsnavely-OptiPlex-980:~/Dropbox/flycap/pytest$ python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import world
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named world
>>> 
jsnavely@jsnavely-OptiPlex-980:~/Dropbox/flycap/pytest$bjam
…找到了10个目标。。。
…正在更新5个目标。。。
MkDir1垃圾箱
MkDir1 bin/gcc-4.5.2
MkDir1-bin/gcc-4.5.2/debug
编译。C++ BIN/GCC-4.5.2/Debug/Word。O
gcc.link.dll bin/gcc-4.5.2/debug/world.so
…更新了5个目标。。。
jsnavely@jsnavely-OptiPlex-980:~/Dropbox/flycap/pytest$python
Python 2.7.1+(r271:868321911年4月11日,18:13:53)
[GCC 4.5.2]关于linux2
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>进口世界
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:没有名为world的模块
>>> 
在正确的目录中:

jsnavely@jsnavely-OptiPlex-980:~/Dropbox/flycap/pytest$ cd bin/gcc-4.5.2/debug/
jsnavely@jsnavely-OptiPlex-980:~/Dropbox/flycap/pytest/bin/gcc-4.5.2/debug$ python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import world
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initworld)
jsnavely@jsnavely-OptiPlex-980:~/Dropbox/flycap/pytest$cd-bin/gcc-4.5.2/debug/
jsnavely@jsnavely-OptiPlex-980:~/Dropbox/flycap/pytest/bin/gcc-4.5.2/debug$python
Python 2.7.1+(r271:868321911年4月11日,18:13:53)
[GCC 4.5.2]关于linux2
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>进口世界
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:动态模块未定义init函数(initworld)

好的,我找到了这不起作用的原因。我的C++类在一个文件中,IDL在另一个文件中。因为它对我来说不像Python或C++,我认为它属于单独的文件。所以IDL的东西永远不会被捡起来

一旦我在World.cpp中把它们放在一起,一切都按预期进行了!也很顺利


我通过查看另一个PythonGraphviz绑定项目发现了这一点,并看到他们所有的Boost.Python内容都与类本身放在同一个文件中

您能检查一下python是否真的试图导入boost::python生成的模块吗?尝试使其名称唯一,以便路径中不存在其他具有相同名称但具有其他扩展名的文件。是的,它将导入正确的文件。我尝试删除该目录中的对象文件,只留下.so文件作为其中的唯一文件,得到了相同的结果。
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import world
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initworld)
>>> 
PyMODINIT_FUNC initworld(void) {
...
}
jsnavely@jsnavely-OptiPlex-980:~/Dropbox/flycap/pytest$ bjam
...found 10 targets...
...updating 5 targets...
MkDir1 bin
MkDir1 bin/gcc-4.5.2
MkDir1 bin/gcc-4.5.2/debug
gcc.compile.c++ bin/gcc-4.5.2/debug/world.o
gcc.link.dll bin/gcc-4.5.2/debug/world.so
...updated 5 targets...
jsnavely@jsnavely-OptiPlex-980:~/Dropbox/flycap/pytest$ python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import world
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named world
>>> 
jsnavely@jsnavely-OptiPlex-980:~/Dropbox/flycap/pytest$ cd bin/gcc-4.5.2/debug/
jsnavely@jsnavely-OptiPlex-980:~/Dropbox/flycap/pytest/bin/gcc-4.5.2/debug$ python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import world
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initworld)