Я работаю над сценарием Python, который вызывает код C ++.Он работает нормально, когда код C ++ скомпилирован в среде cygwin (в Clion) и когда я запускаю скрипт в Windows.Однако я использовал Clion для создания файла .so в Linux (Ubuntu, WSL), используя тот же код и файл cmake. Мой код C ++ компилируется для обеих паттернов.Мой код Python работает на обеих платформах (Python 3.5).Тем не менее, я получаю ошибку в Linux.
Вот мой код C ++.
#include <iostream>
wchar_t * DoSomeThingUseful(wchar_t * input)
{
wchar_t* output = new wchar_t[2];
output[0] = input[0];
output[1] = 'x';
return output;
}
extern "C" {
wchar_t * GetJsonFromJson(wchar_t * input)
{
wchar_t * output = DoSomeThingUseful(input);
return output;
}
}
Вот мой файл cmake.
cmake_minimum_required(VERSION 3.5)
project(ExternalFacade)
set(CMAKE_CXX_STANDARD 14)
add_library(ExternalFacade SHARED library.cpp)
Вот код Python.
from ctypes import *
import os.path
import platform
print('Hello')
operating_system = platform.system()
if operating_system == 'Windows':
library_path = 'C:/Users/Daant/CLionProjects/Share/cmake-build-release/cygExternalFacade.dll'
else:
library_path = '/mnt/c/Users/Daant/CLionProjects/Share/cmake-build-release/libExternalFacade.so'
itExist = os.path.exists(library_path)
print(itExist)
lib = cdll.LoadLibrary(library_path)
print('dll loaded')
lib.GetJsonFromJson.restype = c_wchar_p
input = c_wchar_p('aaa')
memoRefToOutput = lib.GetJsonFromJson(input)
print(memoRefToOutput)
print('End')
Вот вывод при запуске его в Windows.
Hello
True
dll loaded
ax
End
Вот вывод при запуске его в Linux.
Hello
True
dll loaded
Traceback (most recent call last):
File "CallFacade.py", line 17, in <module>
memoRefToOutput = lib.GetJsonFromJson(input)
ValueError: character U+214bae0 is not in range [U+0000; U+10ffff]
Я не понимаю, почему мой код мог нормально работатьв Windows, но не в Linux.Ctypes - это Ctypes .... Кто-нибудь может объяснить, как мне это исправить?