我如何在使用Boost.Python包装到Python的类中使用ofstream?

时间:2014-06-05 10:09:14

标签: python c++ file-io iostream boost-python

我在一个月前更改了代码,并且遇到了我在下面描述的相同错误。我没有找到一个非常简单的例子,如何使用Boost.Python将fstream对象暴露给Python来解决我解释的问题

简而言之,我只想公开一个包含I / O对象的类,其函数为write / open / close。在Pyton我想做这些步骤:

  1. 打开File1
  2. 打开File2
  3. 打开File3
  4. 写入File1
  5. 写入File2
  6. 写入File3
  7. 关闭文件
  8. 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
    (
    

    提前多多谢谢你!

1 个答案:

答案 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;
};

strToWritepath中将参数作为参数传递给openFileWriteToFile成员时,我也认为不需要设置读写引用。< / 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变量也是如此。但我想我已经提到过了。