如何将 const char* 从 python 传递给 c 函数
How to pass const char* from python to c function
我正在 Python 中使用 ctypes
打开一个文件以用 C++ 编写。
我的 C++ 代码:
extern "C" {
void openfile(const char *filename) {
cout<<"File to open for writing = " <<filename<<endl;
FILE *fp = fopen(filename,"w");
fprintf(fp,"writing into file");
fclose(fp);
}
}
我的Python代码:
>>> import ctypes
>>> lib = ctypes.cdll.LoadLibrary('/in/vrtime/mahesh/blue/rnd/software/test/test.so')
>>> outfile = "myfirstfile.txt"
>>> lib.openfile(outfile)
File to open for writing = m
我得到的文件名为 m
,这是我文件的第一个 char
字符。
如何将整个字符串传递给C端?
在 python3 中(而且您肯定会像在 python2 中一样使用 python3,您的代码很幸运)
字符串存储为 wchar_t[]
缓冲区,因此当您传递 "myfirstfile.txt"
C 函数将其 arg 视为 "m[=18=]y[=18=]..."
,这显然是一个长度为 1 的 C 字符串。
这是问题的表现:
In [19]: from ctypes import cdll, c_char_p
In [20]: libc = cdll.LoadLibrary("libc.so.6")
In [21]: puts = libc.puts
In [22]: puts('abc')
a
您应该向 C 函数传递一个 bytes
对象
In [23]: puts(b'abc')
abc
您可以像这样将 str
转换为 bytes
:
puts(my_var.encode())
为避免进一步混淆,您可以指定 C 函数的参数类型:
In [27]: puts.argtypes = [c_char_p]
现在函数接受 bytes
(ctypes 将其转换为 char*
):
In [28]: puts(b'abc')
abc
但不是 str
:
In [30]: puts('abc')
---------------------------------------------------------------------------
ArgumentError Traceback (most recent call last)
<ipython-input-26-aaa5b59630e2> in <module>()
----> 1 puts('abc')
ArgumentError: argument 1: <class 'TypeError'>: wrong type
我正在 Python 中使用 ctypes
打开一个文件以用 C++ 编写。
我的 C++ 代码:
extern "C" {
void openfile(const char *filename) {
cout<<"File to open for writing = " <<filename<<endl;
FILE *fp = fopen(filename,"w");
fprintf(fp,"writing into file");
fclose(fp);
}
}
我的Python代码:
>>> import ctypes
>>> lib = ctypes.cdll.LoadLibrary('/in/vrtime/mahesh/blue/rnd/software/test/test.so')
>>> outfile = "myfirstfile.txt"
>>> lib.openfile(outfile)
File to open for writing = m
我得到的文件名为 m
,这是我文件的第一个 char
字符。
如何将整个字符串传递给C端?
在 python3 中(而且您肯定会像在 python2 中一样使用 python3,您的代码很幸运)
字符串存储为 wchar_t[]
缓冲区,因此当您传递 "myfirstfile.txt"
C 函数将其 arg 视为 "m[=18=]y[=18=]..."
,这显然是一个长度为 1 的 C 字符串。
这是问题的表现:
In [19]: from ctypes import cdll, c_char_p
In [20]: libc = cdll.LoadLibrary("libc.so.6")
In [21]: puts = libc.puts
In [22]: puts('abc')
a
您应该向 C 函数传递一个 bytes
对象
In [23]: puts(b'abc')
abc
您可以像这样将 str
转换为 bytes
:
puts(my_var.encode())
为避免进一步混淆,您可以指定 C 函数的参数类型:
In [27]: puts.argtypes = [c_char_p]
现在函数接受 bytes
(ctypes 将其转换为 char*
):
In [28]: puts(b'abc')
abc
但不是 str
:
In [30]: puts('abc')
---------------------------------------------------------------------------
ArgumentError Traceback (most recent call last)
<ipython-input-26-aaa5b59630e2> in <module>()
----> 1 puts('abc')
ArgumentError: argument 1: <class 'TypeError'>: wrong type