Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> из питона на с++ 
:(
    Опции темы
mrgloom
Дата 26.4.2012, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



есть пара файлов на питоне *.py
надо их автоматом перевести на с++ или же собрать библиотеку или длл чтобы можно было из с++ вызывать.
там подключаются следующие модули
Код

import socket
import string
import struct
import sys


возможно ли?
PM MAIL   Вверх
kosmonaFFFt
Дата 26.4.2012, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Можно заюзать boost::python или просто в C коде создать интерпретатор питона и выполнять скрипты...


--------------------
user posted image
PM MAIL ICQ   Вверх
mrgloom
Дата 26.4.2012, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



Цитата

boost::python

это для выполнения участков кода? а можно подключать питоновые библиотеки? интерпретатор нужно с собой таскать?

Цитата

просто в C коде создать интерпретатор питона и выполнять скрипты

имеется ввиду самописный интерпретатор?

PM MAIL   Вверх
mrgloom
Дата 26.4.2012, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



а с помощью py2exe нельзя сделать dll?
PM MAIL   Вверх
mrgloom
Дата 26.4.2012, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



http://docs.python.org/extending/embedding.html

вот нашел, но я не понял с программой надо все таки таскать интерпретатор в таком случае или нет?
PM MAIL   Вверх
rsm
Дата 27.4.2012, 03:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: нет
Всего: 62



Цитата(mrgloom @  26.4.2012,  16:34 Найти цитируемый пост)
я не понял с программой надо все таки таскать интерпретатор в таком случае или нет?

Надо, причём свой собственный, который напишешь для обработки скриптов.
PM MAIL   Вверх
mrgloom
Дата 27.4.2012, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



Цитата(rsm @  27.4.2012,  03:18 Найти цитируемый пост)
Надо, причём свой собственный, который напишешь для обработки скриптов. 


ну по-моему это бред, зачем писать парсер+библиотеки, если питон как бы уже имеет среду выполнения.

там(выше в постах) вроде бы есть методы как вызывать код питона из кода с++, но для меня остался открытым вопрос нужно
ли будет устанавливать интерпретатор питона на машине на которой будет запускаться программа?
или например можно как то "вложить" это сразу всё в код, я хочу статическую линковку, т.е. на выходе только 1 .exe.
или например надо за собой таскать что то навроде python27.dll или подключать python27.lib?

так же не очень понятно как использовать уже готовый код на питоне, ну вот у меня допустим есть 2 .py файла,
которые писал не я, но я хочу использовать код который там, там есть import'ы (вроде бы стандартные), но меня все равно это смущает,
т.к. т.к. это потянется все в код, как я пониаю?
потом там есть классы и функции не понятно как это привязать к классам и функциям на с++.

т.е. в идеале я вообще хотел бы так 

с++ код

Код

class my_python;
my_python.DoSomeFunction(int f, ...);


т.е. чтобы весь этот питон код был скрыт от меня и лучше бы наверно в отдельную библиотеку.
PM MAIL   Вверх
kosmonaFFFt
Дата 27.4.2012, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Свой интерпретатор ИМХО писать не надо, достаточно прилинковаться к питоновской билиотеке, не уверен что стандартные питоновские либы просто так заработают, скорее всего придется какие-то файлы питона за собой тянуть...


--------------------
user posted image
PM MAIL ICQ   Вверх
mrgloom
Дата 27.4.2012, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



http://docs.python.org/release/2.5.2/ext/callingPython.html
http://www.codeproject.com/Articles/11805/...n-in-C-C-Part-I
http://www.codeproject.com/Articles/11843/...-in-C-C-Part-II
вот еще какие-то методы, но все вышеперечисленные вопрсы они не разъяснили.

пока попробую shedskin может получится просто перегнать код в с++

 UPD: shedskin лажа полная, там столько ограничений, что только головная боль.

Это сообщение отредактировал(а) mrgloom - 27.4.2012, 12:11
PM MAIL   Вверх
mrgloom
Дата 27.4.2012, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



ладно давайте вообще рассмотрим самый простой пример 

Код

# hello.py
def my_sum(x,y):
    print "Hello World!"
    return x*x+y


как мне вызвать этот код? из с++?

т.е. я должен получить что то типа

Код

int sum= py.my_sum(x,y);

PM MAIL   Вверх
rsm
Дата 27.4.2012, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: нет
Всего: 62



Цитата(mrgloom @  27.4.2012,  11:41 Найти цитируемый пост)
зачем писать парсер+библиотеки, если питон как бы уже имеет среду выполнения

Парсер писать не надо. Надо будет линковать к своей программе библиотеку Python. Т.е. по сути получится тот же самый интерпретатор, только без интерактивного режима и выполняющий только одну конкретную задачу.

Цитата(mrgloom @  27.4.2012,  11:41 Найти цитируемый пост)
можно как то "вложить" это сразу всё в код, я хочу статическую линковку, т.е. на выходе только 1 .exe

Можно слинковать библиотеку Python статически. Тогда получится один бинарник (интерпретатор), которые будет выполнять передаваемые ему в качестве аргументов (или как-то ещё) скрипты.

Цитата(mrgloom @  27.4.2012,  13:04 Найти цитируемый пост)
ладно давайте вообще рассмотрим самый простой пример / как мне вызвать этот код? из с++?

Как-то так (исходники примера в аттаче).

Код

#include <stdio.h>
#include <Python.h>

#define FIRST_ARG (10)             /* первый аргумент x */
#define SECOND_ARG (20)            /* второй аргумент y */
#define MODULE_FILE ("hello.py")   /* файл с кодом Python */
#define FUNCTION_NAME ("my_sum")   /* название функции */

int main(int argc, char **argv)
{
    FILE* fp;
    PyObject *result, *module, *globals, *function;

    /* инициализируем интерпретатор */

    Py_Initialize();

    /* открываем файл с кодом Python */

    fp = fopen(MODULE_FILE, "r");

    /* прогоняем код через интерпретатор */

    PyRun_SimpleFile(fp, MODULE_FILE);

    /* импортируем модуль __main__ из выполненного кода */

    module = PyImport_AddModule("__main__");

    /* получаем словарь со всеми экспортируемыми модулем объектами */
    
    globals = PyModule_GetDict(module);

    /* получаем указатель на функцию */

    function = PyDict_GetItemString(globals, FUNCTION_NAME);

    /* вызываем функцию, аргументы - два целых числа типа `int' */

    result = PyObject_CallFunction(function, "ii", FIRST_ARG, SECOND_ARG);

    /* выводим результат вызова функции */

    printf("result = %ld\n", PyInt_AsLong(result));

    /* завершаем работу интерпретатора */

    Py_Finalize();

    /* закрываем файл */
    
    fclose(fp);

    return 0;
}

Это самый примитивнейший вариант, из которого выпилены все проверки результатов вызовов функций и весь код по освобождению занятой памяти. В нормальном варианте всё должно проверяться и память - освобождаться. И тем не менее, как бы глупо это ни звучало, это вполне полноценный интерпретатор Python.

Это сообщение отредактировал(а) rsm - 28.4.2012, 03:26

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  embedded_python_example.zip 1,45 Kb
PM MAIL   Вверх
mrgloom
Дата 28.4.2012, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



Цитата

Можно слинковать библиотеку Python статически.

все таки я не очень понял про что вы. это присоединить к проекту на с++ исходный код интерпретатора?
так вспомогательные функции (которые лежат в папке Lib)  опять же написаны на питоне.

насчет кода , в итоге я так и сделал, только мне приходится таскать с собой python27.dll, необходимые файлы .py из Lib и свои .py файлы из которых я вызываю функцию, в принципе и так можно, но хотелось бы все это запаковать в один .exe файл.
PM MAIL   Вверх
rsm
Дата 28.4.2012, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: нет
Всего: 62



Цитата(mrgloom @  28.4.2012,  14:01 Найти цитируемый пост)
присоединить к проекту на с++ исходный код интерпретатора?

smile

Цитата(mrgloom @  28.4.2012,  14:01 Найти цитируемый пост)
в принципе и так можно, но хотелось бы все это запаковать в один файл

Для этого и существует управление пакетами. Собирается пакет для нужного дистрибутива и устанавливается штатными средствами.
PM MAIL   Вверх
mrgloom
Дата 5.5.2012, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



пытаюсь вызвать так. кстати так получается вызывать только функции, а как вызывать метод класса?
Код

string call_python_func_str(char* module,char* func_name,PyObject *pArgs)
{
    PyObject *pName, *pModule, *pFunc;
    PyObject *pValue;
    string ret;

    Py_Initialize();
    pName = PyString_FromString(module);

    pModule = PyImport_Import(pName);
    Py_DECREF(pName);

    if (pModule != NULL) 
    {
        pFunc = PyObject_GetAttrString(pModule, func_name);

        if (pFunc && PyCallable_Check(pFunc)) 
        {
            pValue = PyObject_CallObject(pFunc, pArgs);
            Py_DECREF(pArgs);
            if (pValue != NULL) 
            {
                // Set return value
                string temp(PyString_AsString(pValue));
                ret= temp;
                Py_DECREF(pValue);
            }
            else 
            {
                Py_DECREF(pFunc);
                Py_DECREF(pModule);
                PyErr_Print();
                fprintf(stderr,"Call failed\n");
                //return -1;
            }
        }
        else 
        {
            if (PyErr_Occurred())
                PyErr_Print();
            fprintf(stderr, "Cannot find function \"%s\"\n", func_name);
            //return -1;
        }
        Py_XDECREF(pFunc);
        Py_DECREF(pModule);
    }
    else 
    {
        PyErr_Print();
        fprintf(stderr, "Failed to load \"%s\"\n", module);
    }
    Py_Finalize();

    return ret;
}


Это сообщение отредактировал(а) mrgloom - 5.5.2012, 16:22
PM MAIL   Вверх
rsm
Дата 5.5.2012, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: нет
Всего: 62



Цитата(mrgloom @  5.5.2012,  18:03 Найти цитируемый пост)
как вызывать метод класса?

Для этого сначала нужно создать класс! © К.О.
Вот прекрасный, очень маленький и очень простой биндинг к ALSA - там и классы, и callback, и даже python egg smile
PM MAIL   Вверх
mrgloom
Дата 24.5.2012, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



как то там всего много и  сложно для меня, не могли бы вы указать хотя бы какие функции стоит посмотреть более пристально или привести пример использования?
PM MAIL   Вверх
rsm
Дата 24.5.2012, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: нет
Всего: 62



Проще разве что "hello, world". pyalsa это хорошо отлаженный и отформатированный код, читается как роман. Нужно просто начать с самого маленького по объёму файла, параллельно заглядывая в официальную документацию по Python/C API.

Какие функции использовать - напрямую зависит от того, что нужно. Если все типы стандартные (int, float, char* и т.д.), это одно. Если типы не стандартные - совершенно другое. Если у функций много аргументов, причём некоторые могут быть заданы по-умолчанию - это третье. В целом, лично я установил для себя всего одно правило: модуль, написанный на С, должен обеспечивать максимально "питонистый" интерфейс. К примеру, если нужно вызвать функцию С, которая принимает аргументом структуру, то в Python эта структура должна быть представлена словарём - естественным для Python типом данных. Если функция С возвращает код ошибки, нужно не возвращать в Python этот код ошибки, а генерировать исключение - потому что для Python это, опять же, наиболее естественное и ожидаемое поведение. Причём исключения должны быть по возможности стандартными. Например, некорректное значение аргумента функции => генерируем ValueError. Если подходящего класса исключений в стандартной библиотеке Python нет, то нужно создать свой класс и использовать его. И так далее, в том же духе. "Питонистость" во всём модуле.

Что касается примеров, то я и сам нигде не мог их найти. Просто брал маленькие краткие биндинги и смотрел, как они написаны. Читал документацию. В этом Сила открытого софта smile

Это сообщение отредактировал(а) rsm - 24.5.2012, 17:08
PM MAIL   Вверх
Karadul
Дата 25.5.2012, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



Цитата(rsm @  24.5.2012,  16:38 Найти цитируемый пост)
Какие функции использовать - напрямую зависит от того, что нужно. Если все типы стандартные (int, float, char* и т.д.), это одно. Если типы не стандартные - совершенно другое. Если у функций много аргументов, причём некоторые могут быть заданы по-умолчанию - это третье. В целом, лично я установил для себя всего одно правило: модуль, написанный на С, должен обеспечивать максимально "питонистый" интерфейс. К примеру, если нужно вызвать функцию С, которая принимает аргументом структуру, то в Python эта структура должна быть представлена словарём - естественным для Python типом данных. Если функция С возвращает код ошибки, нужно не возвращать в Python этот код ошибки, а генерировать исключение - потому что для Python это, опять же, наиболее естественное и ожидаемое поведение. Причём исключения должны быть по возможности стандартными. Например, некорректное значение аргумента функции => генерируем ValueError. Если подходящего класса исключений в стандартной библиотеке Python нет, то нужно создать свой класс и использовать его. И так далее, в том же духе. "Питонистость" во всём модуле.

Я больше сталкивался с тем, что делается копия сишного апи на питоне(_winreg/pycurl), а для него уже пишутся обертки.
PM MAIL   Вверх
rsm
Дата 26.5.2012, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: нет
Всего: 62



Цитата(Karadul @  25.5.2012,  21:41 Найти цитируемый пост)
делается копия сишного апи на питоне(_winreg/pycurl), а для него уже пишутся обертки

Увы, не всегда возможно. Например, когда C оперирует сложными структурами - тут без вариантов, нужно сразу писать конвертацию "структура" <=> "словарь". Другой вариант - когда C реализует квази-ООП. Ещё вариант - асинхронная обработка данных. В общем, каждый случай индивидуален. Но в целом да, согласен - на некоторых задачах быстрее и проще сначала написать интерфейс модуля "в стиле С", а потом уже добавить ему "питонистость" средствами самого Python.
PM MAIL   Вверх
Karadul
Дата 26.5.2012, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



Цитата(rsm @  26.5.2012,  03:15 Найти цитируемый пост)
а потом уже добавить ему "питонистость" средствами самого Python.

Только добавлять эту "питонистость" - работа, видимо, неблагодарная, поэтому о ней часто забывают.

"Питонистость" (а точнее, ООП-шность - "жавоидность" будет выглядеть почти так же) состоит не из структур данных, а, например, вместо кодов возврата должны бросаться исключения. И этому не всегда следуют даже встроенные модули питона (poplib/imaplib возвращают кортежи с содержимым, которое хрен запомнишь). Еще программа не должна грохаться с сегфолтом, а бросать вменяемое исключение, поэтому, например, кто-то должен проверять типы параметров - или нативный модуль, или питоновая обертка (wireshark через lua api грохался на ура, если ему подсунуть не тот обьект).

Цитата(rsm @  26.5.2012,  03:15 Найти цитируемый пост)
Другой вариант - когда C реализует квази-ООП. 

А в чем проблема перевести квази в не квази для питона? Ну и само собой разумеется, что структуры данных должны конвертироваться в те, которые есть на питоне. Асинхронная обработка так же реализуется через коллбеки.

Ключевые моменты "питонистости" оберток - это:
  • ООП интерфейс со всеми прибамбасами (инкапсуляция, возврат обьекта, а не числового идентификатора, который потом куда-то хреначится)
  • Исключения вместо кодов возврата
  • keyword arguments
  • Собственно питонистость - например, в pycurl прокси устанавливается тремя опциями отдельно (хост, порт, тип), пистонисто это должен быть кортеж (хост, порт, тип) как один параметр.
  • Мне лично больше всего не нравится, когда обертки "текут", т.е. для того, чтобы ей нормально пользоваться, надо знать C и сишный интерфейс, который вроде бы должен полностью закрываться высокоуровневым API. То документацию не напишут, потому что "нинужно" (касается как раз апинсорса), то обертка "течет", надо следить самому за типом параметров - а для начала, если программа упадет, догадаться, что же ты сделал не так.


Это сообщение отредактировал(а) Karadul - 26.5.2012, 17:14
PM MAIL   Вверх
rsm
Дата 27.5.2012, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: нет
Всего: 62



Цитата(Karadul @  26.5.2012,  19:03 Найти цитируемый пост)
Только добавлять эту "питонистость" - работа, видимо, неблагодарная, поэтому о ней часто забывают

Не все программеры - быдло-кодеры smile

Цитата(Karadul @  26.5.2012,  19:03 Найти цитируемый пост)
А в чем проблема перевести квази в не квази для питона?

В определении того, метод какого класса нужно вызвать.

Цитата(Karadul @  26.5.2012,  19:03 Найти цитируемый пост)
Асинхронная обработка так же реализуется через коллбеки

Конечно, только нужно не забыть про сборку мусора и GIL.
PM MAIL   Вверх
Karadul
Дата 27.5.2012, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



Цитата(rsm @  27.5.2012,  07:36 Найти цитируемый пост)
Не все программеры - быдло-кодеры

Тем не менее, _winreg попал в стандартную библиотеку питона. Хотя нормальная обертка для него - строк на 20.

Цитата(rsm @  27.5.2012,  07:36 Найти цитируемый пост)
Конечно, только нужно не забыть про сборку мусора и GIL.

А что со ними?

Сишкопроблемы smile Языки со сборкой мусора от них свободны.
PM MAIL   Вверх
rsm
Дата 27.5.2012, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: нет
Всего: 62



Цитата(Karadul @  27.5.2012,  16:11 Найти цитируемый пост)
А что со ними? Сишкопроблемы. Языки со сборкой мусора от них свободны

В асинхронных модулях нужно быть предельно внимательным к контролю времени жизни объектов, т.к. по факту никакого достаточно прямого способа обнаружить утечки памяти нет. Добавим к этому GIL - и получаем феерическую головную боль. Поэтому простой обёрткой уже не обойтись - нужно создавать объекты и манипулировать ими со стороны С. В противном случае поведение становится трудно предсказуемым.
PM MAIL   Вверх
Karadul
Дата 27.5.2012, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



А чем плох именно GIL?
Можно сделать так, что обьектом займется питоновский мусоровоз?
PM MAIL   Вверх
rsm
Дата 28.5.2012, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: нет
Всего: 62



Цитата(Karadul @  28.5.2012,  01:12 Найти цитируемый пост)
А чем плох именно GIL? Можно сделать так, что обьектом займется питоновский мусоровоз?

Проблема не в GIL как таковом, проблема в скрещивании С и Python. Требуется уделить большое внимание тому, чтобы объект, убранный GC в Python, не был повторно освобождён из С. Или наоборот - чтобы Python не пытался использовать объект, уже освобождённый в С. Из-за наличия в интерпретаторе мощных оптимизаций расхода памяти, по адресу, который уже освободили, сразу же могут оказаться совершенно другие данные, которые Python и/или С могут воспринять как должное. Такие ошибки сложнее всего отловить. Или, к примеру, гонка за ресурсы - что получится, если Python уже заблокировал GIL, а часть со стороны С изменила какой-то объект? Конечно, средства для устранения подобных ситуаций предусмотрены, но за ними нужно пристально следить. Да и то нет полной гарантии отсутствия ошибок.
PM MAIL   Вверх
Karadul
Дата 28.5.2012, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



Ыыыы, а это когда из си вызывается питон или модули на питоне написаны на си?
PM MAIL   Вверх
rsm
Дата 28.5.2012, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: нет
Всего: 62



Цитата(Karadul @  28.5.2012,  18:32 Найти цитируемый пост)
Ыыыы, а это когда из си вызывается питон или модули на питоне написаны на си? 

Не принципиально. Как правило, на С пишется модуль и подключается к Python. Можно и наоборот, но такое действительно нужно крайне редко.
PM MAIL   Вверх
Karadul
Дата 28.5.2012, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



Цитата(rsm @  28.5.2012,  17:12 Найти цитируемый пост)
но такое действительно нужно крайне редко.

Плагины на питоне? Для lua это вообще основной use case.
PM MAIL   Вверх
rsm
Дата 29.5.2012, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: нет
Всего: 62



Цитата(Karadul @  28.5.2012,  20:05 Найти цитируемый пост)
Плагины на питоне? Для lua это вообще основной use case

Да, бывает. Но действительно - крайне редко.
PM MAIL   Вверх
Karadul
Дата 31.5.2012, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



А зря. Лепят всюду этот луа, в котором ни стандартной библиотеки искаропки, ни даже нормального ООП.
PM MAIL   Вверх
mrgloom
Дата 1.6.2012, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



допустим использую PyRun_SimpleString

возник  вопрос, как контролировать выполнилась ли строчка кода или нет?
ну допустим, если разработчиком питон кода сделано так, что функция скажем возвращает 0 или 1 
в зависимости от того выполнилась или нет, то можно просто получать это возвращаемое значение.
а если это не предусмотрено? теортетически даже непонятно, что в консоль питона должно вывестись.
а если чего то не хватает, как у меня было с import _socket или еще какая ошибка?
тем более вообще не понятно можем ли мы как то отслеживать, что выводится в консоль питона. 
PM MAIL   Вверх
rsm
Дата 1.6.2012, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: нет
Всего: 62



Цитата(mrgloom @  1.6.2012,  11:32 Найти цитируемый пост)
как контролировать выполнилась ли строчка кода или нет?

На время отладки возвращать более развёрнутый результат, плюс вести лог всех вызовов. Только не в консоль, а в файл - в консоли никаких сообщений из модуля на С не будет. Если нужна более продвинутая отладка - помогут gdb и Python, собранный с отладочной информацией.

Цитата(mrgloom @  1.6.2012,  11:32 Найти цитируемый пост)
а если это не предусмотрено? теортетически даже непонятно, что в консоль питона должно вывестись

Не предусмотрено кем?

Цитата(mrgloom @  1.6.2012,  11:32 Найти цитируемый пост)
а если чего то не хватает, как у меня было с import _socket или еще какая ошибка?

Поможет strace.
PM MAIL   Вверх
Karadul
Дата 1.6.2012, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



Цитата(rsm @  1.6.2012,  18:12 Найти цитируемый пост)
Только не в консоль, а в файл - в консоли никаких сообщений из модуля на С не будет. 

pycurl как-то на stdout пишет.
PM MAIL   Вверх
rsm
Дата 2.6.2012, 04:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: нет
Всего: 62



Цитата(Karadul @  2.6.2012,  01:26 Найти цитируемый пост)
pycurl как-то на stdout пишет

Это текст исключений, которые обрабатывает и показывает Python. Сам pycurl как таковой ничего и никуда не пишет, он только генерирует исключения.
PM MAIL   Вверх
Karadul
Дата 3.6.2012, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



Ну так тоже ведь можно?
PM MAIL   Вверх
rsm
Дата 4.6.2012, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: нет
Всего: 62



Цитата(Karadul @  4.6.2012,  01:20 Найти цитируемый пост)
Ну так тоже ведь можно? 

Конечно. Просто нужно держать в голове, что модуль С как таковой никуда и никаких сообщений не выводит. А только генерирует исключения.
PM MAIL   Вверх
mrgloom
Дата 9.6.2012, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



Код

void CPythonInterface::init_import()
{
    static const char *program = ""
    "import time\n"
    "import sem_\n"
    "import Image";

    PyRun_SimpleString(program);
}


ну вот например, загружаю свою длл, там в конструкторе стоит эта функция, падает на PyRun_SimpleString, причем что не так непонятно, прост опишет triggered a breakpoit, это если запускаю из дебага, а если в релизе, то просто моя длл-ка не грузится, getlasterror выдает ошибку 998. (Неверная попытка доступа к адресу памяти.)
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1263 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.