linux:python:使用swig连接python与c
差别
这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
linux:python:使用swig连接python与c [2020/10/16 00:34] – 创建 zhangguo | linux:python:使用swig连接python与c [2023/03/17 10:12] (当前版本) – 外部编辑 127.0.0.1 | ||
---|---|---|---|
行 2: | 行 2: | ||
注:仅示例python3 | 注:仅示例python3 | ||
+ | |||
+ | swig官方文档:http:// | ||
+ | |||
+ | |||
+ | ===== - python端发送bytes数据到c ===== | ||
+ | |||
通过python发一组数据到C,C调用底层硬件完成数据收尾操作,数据主要是char *的形式到c,python这边需要使用bytes对其相连。 | 通过python发一组数据到C,C调用底层硬件完成数据收尾操作,数据主要是char *的形式到c,python这边需要使用bytes对其相连。 | ||
行 9: | 行 15: | ||
from binascii import b2a_hex, a2b_hex | from binascii import b2a_hex, a2b_hex | ||
- | b = b' | + | b = b' |
print(f' | print(f' | ||
print(f' | print(f' | ||
- | b2a = b' | + | b2a = b' |
a2b = binascii.a2b_hex(b2a) | a2b = binascii.a2b_hex(b2a) | ||
print(f' | print(f' | ||
- | io.py2c_test(a2b, | + | io.py2c_test(a2b, |
</ | </ | ||
- | 在swig的.i文件中需要加入以下内容,表示c char*之间与python bytes相对而不是采用unicode。这一点相当重要,在python中不要使用字符串与C之间传递,而应该用bytes来传递,简单可行,不会发生字符转换规则以及check等等问题(latin-1转换> | + | 在swig的.i文件中需要加入以下内容(仅支持python3),表示c char*之间与python bytes相对而不是采用unicode。这一点相当重要,在python中不要使用字符串与C之间传递,而应该用bytes来传递,简单可行,不会发生字符转换规则以及check等等问题(latin-1转换> |
<code swig> | <code swig> | ||
行 45: | 行 51: | ||
</ | </ | ||
+ | |||
+ | ===== - c返回bytes数据给python ===== | ||
+ | |||
+ | 如果直接用c的char *传数据的话,会在遇到0时,自动把数据截止掉。举个例子: | ||
+ | |||
+ | c原来要返回的数据是0x55001233, | ||
+ | |||
+ | 所以C端返回这样的数据需要使用到struct, | ||
+ | |||
+ | <code c> | ||
+ | typedef struct swig_bytes_data | ||
+ | { | ||
+ | int size; | ||
+ | char *bytes; | ||
+ | } swig_bytes_data; | ||
+ | |||
+ | </ | ||
+ | |||
+ | c端要返回给python的数据,指定好正确的bytes和size之后,python端即能接收到正常的数据。 | ||
+ | |||
+ | 然后在xxx.i文件中,指定typemap(out) | ||
+ | |||
+ | < | ||
+ | |||
+ | %typemap(out) swig_bytes_data | ||
+ | { | ||
+ | $result = PyBytes_FromStringAndSize($1.bytes, | ||
+ | free($1.bytes); | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ==== - 语法参考 ==== | ||
+ | |||
+ | http:// | ||
+ | |||
+ | http:// | ||
+ | |||
+ | |||
+ | ==== - 相关function ==== | ||
+ | <code c> | ||
+ | PyObject* PyBytes_FromStringAndSize(const char *v, Py_ssize_t len) | ||
+ | //Return value: New reference. | ||
+ | //Return a new bytes object with a copy of the string v as value and length len on success, and NULL on failure. If v is NULL, the contents of the bytes object are uninitialized. | ||
+ | |||
+ | |||
+ | |||
+ | PyObject* PyByteArray_FromStringAndSize(const char *string, Py_ssize_t len) | ||
+ | //Return value: New reference. | ||
+ | //Create a new bytearray object from string and its length, len. On failure, NULL is returned. | ||
+ | |||
+ | |||
+ | |||
+ | PyObject* PyUnicode_FromStringAndSize(const char *u, Py_ssize_t size) | ||
+ | //Return value: New reference. | ||
+ | //Create a Unicode object from the char buffer u. The bytes will be interpreted as being UTF-8 encoded. The buffer is copied into the new object. If the buffer is not NULL, the return value might be a shared object, i.e. modification of the data is not allowed. | ||
+ | |||
+ | //If u is NULL, this function behaves like PyUnicode_FromUnicode() with the buffer set to NULL. This usage is deprecated in favor of PyUnicode_New(). | ||
+ | </ |
linux/python/使用swig连接python与c.1602779646.txt.gz · 最后更改: 2023/03/17 10:12 (外部编辑)