Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用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 - Fatal编程技术网

调用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代码:

调用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中字符串作为指向的指针传递。

Python:

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