【问题标题】:Which python argument type would be accepted as char* in python C extension在 python C 扩展中,哪个 python 参数类型将被接受为 char*
【发布时间】:2014-10-12 06:29:27
【问题描述】:

我使用 C++ 编写了一个简单的 Python 扩展,例如:

class Foo
{
   public:
     void Test(char* inbuffer);
};

我使用 Swig 在扩展中生成包装器。

但是我没有通过传递字符串或字节数组来测试这个函数,比如

myobj= foo.Foo()
keydata = "abcd"
myobj.Test(keydata)

我的错误如下:

TypeError:在方法“Test”中,类型为“char *”的参数 2

你有什么建议吗?

【问题讨论】:

  • 向我们展示更多详情。现在还不清楚,会发生什么。
  • char* 是指向空终止字符串的指针吗?该功能是否对其进行了修改?如果不是,为什么不是const char *

标签: python swig


【解决方案1】:

你需要一个类型图。相反,您应该尽可能使用 STL 类,因为它们可以更好地映射到 Python 类型。例如,使用std::string 而不是char*,通过%include std_string.i

%include "std_string.i"

class Foo
{
   public:
     void Test(std::string inbuffer);
};

注意:使用const std::string& 可能没有性能提升,因为无论哪种方式,包装器都必须从 Python 字符串复制到 C++ 字符串。

【讨论】:

    【解决方案2】:

    您的帖子没有包含足够的信息。例如,这适用于 SWIG 2.0.12、Visual Studio 2012 和 Python 3.3。也许这个完整的例子会帮助你找出你的问题。

    foo.i

    %module foo
    
    %inline %{
    #include <stdio.h>
    class Foo {
    public:
        void Test(char* inbuffer) {
            printf("%s\n",inbuffer);
        }
    };
    %}
    

    构建

    swig -c++ -python foo.i
    cl /LD /Ic:\python33\include /Fe_foo.pyd foo_wrap.cxx -link /libpath:c:\python33\libs
    

    输出

    Python 3.3.5 (v3.3.5:62cf4e77f785, Mar  9 2014, 10:35:05) [MSC v.1600 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import foo
    >>> f=foo.Foo()
    >>> f.Test('abc')
    abc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      相关资源
      最近更新 更多