Python - 将字符传递给 C 库

Python - Passing character to C library

本文关键字:字符 Python      更新时间:2023-10-16

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

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

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

# -*- 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
Got: -124

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

你的问题出在 python 代码中,你传递的是字符串而不是字符,单引号和双引号在 python 中几乎完全相同,-124我认为可能来自 python 解释器在内部做的事情,试试这个

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

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