【问题标题】:Cython: working with C++ streamsCython:使用 C++ 流
【发布时间】:2015-09-08 03:33:26
【问题描述】:

问题

如何使用来自 Cython 的 c++ 流(如 std::ifstreamostream)?在 c++ 中,您可以执行以下操作:

std::ofstream output { filename, std::ios::binary };
output.write(...);

您将如何在 Cython 中实现同样的目标?

当前状态

我已经在 Cython 中包装了 fstream 中的结构,以便我可以在函数声明中使用它们的名称,但棘手的部分是使用(也许是在 Cython 中包装)write 方法并创建流。我在网上没有找到任何代码示例。

附: 我知道一个可能的答案是只使用 Python 的 IO,但我需要将流传入和传出我正在与之交互的 C++ 代码。

这是包装流声明的代码:

cdef extern from "<iostream>" namespace "std":
    cdef cppclass basic_istream[T]:
        pass

    cdef cppclass basic_ostream[T]:
        pass

    ctypedef basic_istream[char] istream

    ctypedef basic_ostream[char] ostream

【问题讨论】:

    标签: python c++ io stream cython


    【解决方案1】:

    与包装任何其他 C++ 类相比,c++ iostream 并没有什么特别之处。唯一棘手的一点是访问std::ios_base::binary,我通过告诉 Cython std::ios_base 是一个命名空间而不是一个类来做到这一点。

    # distutils: language = c++
    
    cdef extern from "<iostream>" namespace "std":
        cdef cppclass ostream:
            ostream& write(const char*, int) except +
    
    # obviously std::ios_base isn't a namespace, but this lets
    # Cython generate the correct C++ code
    cdef extern from "<iostream>" namespace "std::ios_base":
        cdef cppclass open_mode:
            pass
        cdef open_mode binary
        # you can define other constants as needed
    
    cdef extern from "<fstream>" namespace "std":
        cdef cppclass ofstream(ostream):
            # constructors
            ofstream(const char*) except +
            ofstream(const char*, open_mode) except+
    
    def test_ofstream(str s):
        cdef ofstream* outputter
        # use try ... finally to ensure destructor is called
        outputter = new ofstream("output.txt",binary)
        try:
            outputter.write(s,len(s))
        finally:
            del outputter
    

    要补充的另一件事是,我没有为完整的模板类层次结构烦恼 - 如果您还想要 wchar 变体,这可能很有用,但只告诉 Cython 您正在使用的类要容易得多实际使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 2011-05-24
      相关资源
      最近更新 更多