Python - 将字符传递给C库

时间:2015-06-21 12:20:59

标签: python c++ linux dll ctypes

在我编写的Linux上运行程序时遇到了麻烦。 由于它是一个相当大的程序,我不会发布整个代码,但只有让我困惑的部分。 我有一个用C ++编写并在Linux Ubuntu上编译的库,它做了一些工作并将一个传入的字符打印到控制台,如下所示:

O(log(n))

整个事情编译得很好,我的Python程序能够调用函数:

bool PostCommand( void* pParam, char c, char* szRet, int nLength, int nBlockTime )
{
    printf("Got: %d", c);
    //do some work
    return true;
}

控制台输出看起来像

# -*- coding: ascii -*-
from ctypes import cdll,c_char,create_string_buffer,...#don't want to list 'em all
m_DLL = cdll.LoadLibrary("./libaddonClient.so")
PostCommand = m_DLL.PostCommand
PostCommand.argtype = [c_void_p,c_char,c_char_p,c_int,c_int]
PostCommand.restype = c_bool

print ord('1')
sz = create_string_buffer(20);
#pObject was generated prior and works fine
PostCommand( pObject, '1', sz, 20, 1 )

我的问题是49如何变成-124。 变量在它的创建和C ++函数或printf的调用之间不会被更改,紧跟在调用之后。 没有线程访问此函数,也没有静态变量。

1 个答案:

答案 0 :(得分:1)

你的问题出现在python代码中,你传递的是字符串而不是字符,单引号和双引号在python中的工作方式几乎完全相同,-124我认为可能是来自python的东西口译员在内部做,试试这个

PostCommand( pObject, ord('1'), sz, 20, 1 )

很可能发生的事情是,解释器处理的参数存储为ac字符串,这是一个nul终止的非nul字节序列,因此几乎肯定会使用指针,因此-124必须是指针的地址,当然需要多于一个字节来表示。