调用c++;来自python的函数 我试图从我的Python代码中调用C++函数,如果我通过布尔或 int 它工作得很好,但是如果我发送一个字符串,它只打印第一个字符。 我正在与以下人员一起编译: g++ -c -fPIC foo.cpp -Wextra -Wall -o foo.o g++ -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o python3 fooWrapper.py 这里是C++和Python代码:
Python:调用c++;来自python的函数 我试图从我的Python代码中调用C++函数,如果我通过布尔或 int 它工作得很好,但是如果我发送一个字符串,它只打印第一个字符。 我正在与以下人员一起编译: g++ -c -fPIC foo.cpp -Wextra -Wall -o foo.o g++ -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o python3 fooWrapper.py 这里是C++和Python代码:,python,c++,python-3.x,Python,C++,Python 3.x,Python: from ctypes import cdll lib = cdll.LoadLibrary("./libfoo.so") lib.Foo_bar("hello") c++: #包括 #包括 #包括 空栏(字符*字符串){ printf(“%s”,字符串); } 外部“C”{ 无效的Foo_条(字符*aString){ 钢筋(收缩); } } 我知道有Boost库,但我无法下载它,这种方法除了字符串外效果很好。 感谢您的帮助问题是在Python 3中字符串作为指向的指针传递。
from ctypes import cdll
lib = cdll.LoadLibrary("./libfoo.so")
lib.Foo_bar("hello")
c++:
#包括
#包括
#包括
空栏(字符*字符串){
printf(“%s”,字符串);
}
外部“C”{
无效的Foo_条(字符*aString){
钢筋(收缩);
}
}
我知道有Boost
库,但我无法下载它,这种方法除了字符串外效果很好。
感谢您的帮助问题是在Python 3中字符串作为指向的指针传递。在little-endian系统中,字符串可以用二进制编码为
"h\0\0\0e\0\0\0l\0\0\0l\0\0\0o\0\0\0\0\0\0\0"
当使用%s
打印时,将在第一个空终止符处停止
对于UTF-8编码的字节字符串(
char*
)。例如:
lib.Foo_bar("hello".encode())
或使用字节或文本:
lib.Foo_bar(b"hello")
如果指定了正确的参数类型,则更好:
from ctypes import cdll, c_char_p
foo_bar = cdll.LoadLibrary("./libfoo.so").Foo_bar
foo_bar.argtypes = [c_char_p]
foo_bar(b"hello\n")
foo_bar("hello\n")
运行时将输出以下内容:
hello
Traceback (most recent call last):
File "foo.py", line 5, in <module>
foo_bar("hello\n")
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type
你好
回溯(最近一次呼叫最后一次):
文件“foo.py”,第5行,在
foo_bar(“你好”\n)
ctypes.ArgumentError:参数1::错误类型
即使用字符串而不是<代码>字节>代码>的后调用将抛出。
< P>您也可以直接使用C++代码> WCHARYTT < /CK>类型处理C++中的Python字符串。在这种情况下,你需要在C++中做任何必要的转换,比如:#包括
#包括
#包括
空心钢筋(钢筋混凝土结构)
{
//荣誉:https://stackoverflow.com/a/18374698
std::wstring_convert;
STD::告诉我, %I/Eng>是什么?为什么当你在写C时,你声称这是C++?只是改为<代码> %s>代码>,这是一个旧的尝试,因为这只是代码的一小部分,它是一个测试,但是我看到我必须声明它是“代码>外部”C。<代码> >,但我可以在代码> bar /代码>函数中使用任何C++。你应该考虑对Python提交一个文档错误。在他们的手册中没有出现对这个主题的处理。<代码> WCARGYTT <代码>在一个地方显示,但没有解释。<代码> WCARGYTT < /C>和Chan-CARS没有解释。谢谢你的回答,WO我做得很好!
hello
Traceback (most recent call last):
File "foo.py", line 5, in <module>
foo_bar("hello\n")
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type