Как предотвратить платформу ValueError в python при вызове кода C ++? - PullRequest
0 голосов
/ 11 июня 2018

Я работаю над сценарием 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 .... Кто-нибудь может объяснить, как мне это исправить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...