Пусть C запустит Python Interpreter под USC-2 - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь запустить Python, встроенный в простую программу на Си.Однако, когда я импортирую модуль, я получаю ошибку undefined symbol: PyUnicodeUCS2_DecodeUTF8.

После дальнейшего изучения я обнаружил, что интерпретатор Python, запущенный под Py_Initialize();, использует кодировку UCS-4, тогда как модуль, который я пытаюсь импортировать, использует кодировку UCS-2.Я спрашиваю, есть ли способ инициализировать интерпретатор Python с правильной кодировкой.Я использую систему Centos7 Linux, которая в основном использует USC2, и я не знаю, почему встроенный интерпретатор использует код USC-4

C: embed.c

#include <Python.h>
int main (int argc, char *argv[]) 
{
  Py_Initialize();
  pName = PyString_FromString(argv[1]); //get name of module to import
  pModule = PyImport_Import(pName);
}

Python

print( __file__ + ": Encoding: " + str(sys.maxunicode)) #How I printed out the interpreter encoding which is 1114111
import torch

Makefile

gcc -I /usr/include/python2.7 embed.c -o embed -lpython2.7

Код компилируется, но я получаю это сообщение об ошибке: undefined symbol: PyUnicodeUCS2_DecodeUTF8.

1 Ответ

0 голосов
/ 05 июля 2019

Нет способа инициализировать интерпретатор с правильной кодировкой. Будет ли интерпретатор использовать UCS2 или UCS4 - выбор во время компиляции. Что вам нужно сделать, это перекомпилировать весь модуль из исходного кода. Если у вас нет исходников для модуля, вы должны скомпилировать Python 2.7 из исходного кода и быть осторожным, чтобы не заменить системный python 2.7 на него.

Сборки UCS2 считались ошибкой, поскольку там символы, отличные от BMP, будут представлены в виде суррогатных пар UTF-16, которые теперь становятся видимыми в виде отдельных кодовых точек. Вот почему Python 3 не имеет этой опции времени компиляции, поскольку он всегда использует UCS4 для внутренних строк, которые не могут быть представлены в UCS2.

...