вторник, 17 апреля 2012 г.

Перенаправление ввода\ввывода в embedded Python

Потребовалось перехватывать вывод питона, очень простой способ нашёлся тут - http://python-dev.info/redirecting-embedded-pythons-io/

Простой рабочий пример:

    Py_Initialize();

    PyObject *sys = PyImport_ImportModule("sys");
    PyObject *out = PyFile_FromString("python_out", "w+");
    PyObject_SetAttrString(sys, "stdout", out);

    PyRun_SimpleString("print 'hello'");

    FILE *output = PyFile_AsFile(out);
    fflush(output);
    fclose(output);

    Py_Finalize();

вторник, 10 апреля 2012 г.

Python 2.x и русские строки

Локализованный Windows, зараза, выплёвывает локализованные результаты работы утилит.
Потратил два часа на то, чтобы найти вхождение строкового литерала в этом результате.
Постфактум - все элементарно, но матов успел сложить стопочку...

Итак - пометки на полях:

1) Чтобы объявить строковой литерал кириллицей надо указать кодировку файла, иначе питончик падает с синтаксической ошибкой: SyntaxError: Non-ASCII character '\xcf' in file
Лечится добавлением в заголовок следующих строчек:
#!/usr/bin/python
# -*- coding: utf-8 -*-


2) Для сравнения строк необходимо их привести к одной кодировке:
В случае строкового литерала делаем так:
cyrillic_literal = 'Печатаемое имя:'.decode('cp1251')

А для внешних данных:
line = line.decode(sys.stdin.encoding)