我在一个月前更改了代码,并且遇到了我在下面描述的相同错误。我没有找到一个非常简单的例子,如何使用Boost.Python将fstream对象暴露给Python来解决我解释的问题
简而言之,我只想公开一个包含I / O对象的类,其函数为write / open / close。在Pyton我想做这些步骤:
C / C ++代码
////// I N C L U D E S //////
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python.hpp>
#include <fstream>
#include <string.h>
////////////////////////////
using namespace std;
struct BoostXML_IO
{
ofstream File;
void writeFile(const string& strToWrite)
{
this->File.write(strToWrite.data(), strToWrite.size());
}
void openFile(const string& path)
{
this->File.open(path, ios::app);
}
void closeFile()
{
this->File.close();
}
};
BOOST_PYTHON_MODULE(BoostXML_IO)
{
using namespace boost::python;
class_<BoostXML_IO, boost::noncopyable>("BoostXML_IO")
.def("writeFile", &BoostXML_IO::writeFile)
.def("openFile", &BoostXML_IO::openFile)
.def("closeFile", &BoostXML_IO::closeFile)
;
}
这段代码总是编译没有错误,但最后在Python中,当我尝试调用提示行中的一个函数时,我总是得到以下错误。
错误代码
>>> import BoostXML_IO
>>> File1 = BoostXML_IO
>>> File = BoostXML_IO.BoostXML_IO.openFileFailed to format the args
Traceback (most recent call last):
File "C:\app\tools\Python25\Lib\site-packages\pythonwin\pywin\idle\CallTips.py", line 130, in get_arg_text
argText = inspect.formatargspec(*arg_getter(fob))
File "C:\app\tools\Python25\Lib\inspect.py", line 743, in getargspec
raise TypeError('arg is not a Python function')
TypeError: arg is not a Python function
(
提前多多谢谢你!
答案 0 :(得分:1)
您的编译错误与Boost.Python无关。首先加入<string>
和<ofstream>
,然后添加using namespace std;
。这应该可以解决你遇到的大部分错误。然后像这样修复你的struct声明:
struct BoostXML_IO
{
void openFile(const string& path)
{
myfile.open(path);
}
void closeFile()
{
myfile.close();
}
void WriteToFile(const char* strToWrite)
{
myfile.write(strToWrite, strlen(strToWrite));
}
private:
ofstream myFile;
};
在strToWrite
和path
中将参数作为参数传递给openFile
和WriteToFile
成员时,我也认为不需要设置读写引用。< / p>
编辑这是怎么回事:
struct BoostXML_IO
{
BoostXML_IO()
{}
void writeFile(const string& strToWrite)
{
File.write(strToWrite.data(), strToWrite.size());
}
void openFile(const string& path)
{
File.open(path, ios::out);
}
void closeFile()
{
File.close();
}
private:
BoostXML_IO(const BoostXML_IO&);
BoostXML_IO& operator=(const BoostXML_IO&);
ofstream File;
};
BOOST_PYTHON_MODULE(BoostXML_IO)
{
using namespace boost::python;
class_<BoostXML_IO>("BoostXML_IO", init<>())
.def("writeFile", &BoostXML_IO::writeFile)
.def("openFile", &BoostXML_IO::openFile)
.def("closeFile", &BoostXML_IO::closeFile)
;
}
我不知道您为什么要将ofstream
公开给python API。对于在pathToFile
中指定文件路径时无效的openFile
变量也是如此。但我想我已经提到过了。