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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> boost.python 
:(
    Опции темы
mrgloom
Дата 27.4.2012, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



рассмотрим самый простой пример 

Код

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



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

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

код C++
Код

int sum= py.my_sum(3,5);


документацию пробовал читать, но что то там сложно и непонятно понадобится ли интерпретатор питона конечной программе?
PM MAIL   Вверх
boostcoder
Дата 27.4.2012, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(mrgloom @  27.4.2012,  12:42 Найти цитируемый пост)
непонятно понадобится ли интерпретатор питона конечной программе?

разумеется.

Цитата(mrgloom @  27.4.2012,  12:42 Найти цитируемый пост)
boost.python

это тут не при чем.
boost.python делает обратное. т.е. код написанный на С/С++ позволяет использовать в пайтон.

читай это: http://docs.python.org/extending/embedding.html
ну мегапростое решение.
Код

#include <Python.h>

int main(int argc, char *argv[]) {
  Py_Initialize();

  static const char *program = ""
    "def my_sum(x,y):\n"
    "\tprint \"Hello World!\"\n"
    "\treturn x*x+y\n";

  PyRun_SimpleString(program);

  Py_Finalize();
  return 0;
}


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


Опытный
**


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

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



Цитата(boostcoder @  27.4.2012,  13:20 Найти цитируемый пост)
разумеется.


ну я про что то типа py2exe, т.е. не надо ставить интерпретатор на другой машине, где потом будет запускаться программа.
т.е. что я примерно хочу это взять и каким либо образом запаковать мои .py файлы и нужное для них из интерпретатора в .lib и затем в мою с++ программу только подключить либу и заголовок с описанием класса с функциями или просто функций.
и потом из кода вызывать примерно так
Код

#include "Py_lib_header.h"
my_py_class a;
int sum= a.my_sum(3,4);

ну или без класса, а просто функцию вызвать.

Цитата

ну мегапростое решение.
код C++
#include <Python.h>
int main(int argc, char *argv[]) {
  Py_Initialize();
  static const char *program = ""
    "def my_sum(x,y):\n"
    "\tprint \"Hello World!\"\n"
    "\treturn x*x+y\n";
  PyRun_SimpleString(program);
  Py_Finalize();
  return 0;
}

ну так и что будет являться результатом этой операции?
мне то надо, как я писал выше, аргументы передать в с++ функцию и результат из неё получить, а тут как я понял просто строка интерпретатору отсылается на выполнение?

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


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



ссылку читай. там показано как из плюсов передавать аргументы в пайтон, и получать результаты обратно.
PM WWW   Вверх
mrgloom
Дата 27.4.2012, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



да, понял. секция 5.3.

хмм получается что для каждого типа возвращаемого значения надо будет написать свою функцию? 
call_python_func(char* module,char* func_name)
или можно как то на месте узнавать тип возвращаемого значения?


да и буст похоже умеет это делать в обе стороны 
http://stackoverflow.com/questions/215752/...ata-back-to-cpp

пытаюсь переписать с примера, но непонятно как передаются параметры просто в строке через пробел?
Код

#include <Python.h>

int
main(int argc, char *argv[])
{
    PyObject *pName, *pModule, *pFunc;
    PyObject *pArgs, *pArg, *pResult;
    int i;

    Py_Initialize();
    pName = PyString_FromString("MyModule.py");
    /* Error checking of pName left out as exercise */

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

    if (pModule != NULL) {
        pFunc = PyObject_GetAttrString(pModule, "MyFunc");
        /* pFunc is a new reference */

        if (pFunc) {
            pArgs = PyTuple_New(0);
            pArg = PyString_FromString("some parameter")  //как передавать параметры? строкой?
            /* pArg reference stolen here: */
            PyTuple_SetItem(pArgs, 0, pArg);
            pResult = PyObject_CallObject(pFunc, pArgs);
            Py_DECREF(pArgs);
            if (pResult != NULL) {
                printf("Result of call: %s\n", PyString_AsString(pResult));
                Py_DECREF(pResult);
            }
            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");
        }
        Py_XDECREF(pFunc);
        Py_DECREF(pModule);
    }
    else {
        PyErr_Print();
        fprintf(stderr, "Failed to load module");
        return 1;
    }
    Py_Finalize();
    return 0;
}


вот нашел еще пример, но тут опять же никаких значений не передается и не возвращается.
Код

// call_function.c - A sample of calling 
// python functions from C code
// 
#include <Python.h>

int main(int argc, char *argv[])
{
    PyObject *pName, *pModule, *pDict, *pFunc, *pValue;

    if (argc < 3) 
    {
        printf("Usage: exe_name python_source function_name\n");
        return 1;
    }

    // Initialize the Python Interpreter
    Py_Initialize();

    // Build the name object
    pName = PyString_FromString(argv[1]);

    // Load the module object
    pModule = PyImport_Import(pName);

    // pDict is a borrowed reference 
    pDict = PyModule_GetDict(pModule);

    // pFunc is also a borrowed reference 
    pFunc = PyDict_GetItemString(pDict, argv[2]);

    if (PyCallable_Check(pFunc)) 
    {
        PyObject_CallObject(pFunc, NULL);  //хотя вот тут можно передавать вместо NULL параметры, только в каком виде?
    } else 
    {
        PyErr_Print();
    }

    // Clean up
    Py_DECREF(pModule);
    Py_DECREF(pName);

    // Finish the Python Interpreter
    Py_Finalize();

    return 0;
}

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


Опытный
**


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

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



вроде разобрался, но все равно не работает.

Код

int call_python_func(char* module,char* func_name)
{
    PyObject *pName, *pModule, *pDict, *pFunc;
    PyObject *pArgs, *pValue;
    int ret;

    Py_Initialize();
    pName = PyString_FromString(module);
    /* Error checking of pName left out */

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

    if (pModule != NULL) 
    {
        pFunc = PyObject_GetAttrString(pModule, func_name);
        /* pFunc is a new reference */

        if (pFunc && PyCallable_Check(pFunc)) 
        {
            pArgs = Py_BuildValue("5.0","15.0");  //вообще должны передаваться в функцию
            pValue = PyObject_CallObject(pFunc, pArgs);
            Py_DECREF(pArgs);
            if (pValue != NULL) 
            {
                // Set return value
                ret = (int)PyFloat_AsDouble(pValue);
                printf("Result of call: %ld\n", PyInt_AsLong(pValue));
                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;
}
int main(int argc, char *argv[])
{
    cout<<call_python_func("test","myadd");
    getchar();
    return 0;
}


на питоне файл
Код

def myadd(a,b):
    f= a*a+b
    print(f)
    print("hell0 add")
    return f
    
    myadd(3,6)


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


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(mrgloom @  27.4.2012,  17:08 Найти цитируемый пост)
пишет что не может найти myadd

покажи какое именно сообщение пишет.
PM WWW   Вверх
volatile
Дата 28.4.2012, 02:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(mrgloom @  27.4.2012,  17:08 Найти цитируемый пост)
   cout<<call_python_func("test","myadd");

Цитата(mrgloom @  27.4.2012,  17:08 Найти цитируемый пост)
пишет что не может найти myadd
     


Назовите ваш модуль другим именем. 
test - встроенный модуль, и там нет "myadd"
PM MAIL   Вверх
volatile
Дата 28.4.2012, 03:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Еще вот что заметил
Цитата(mrgloom @  27.4.2012,  17:08 Найти цитируемый пост)
pArgs = Py_BuildValue("5.0","15.0");  

это не правильно
Если вы хотите передать 2 дабла, то
Код

pArgs = Py_BuildValue("dd", 5.0, 15.0);
если 2 инта,то 
Код

pArgs = Py_BuildValue("ii", 5, 15);


Добавлено через 5 минут и 4 секунды
http://docs.python.org/release/1.5.2/ext/buildValue.html
PM MAIL   Вверх
mrgloom
Дата 28.4.2012, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



да спасибо, так работает, протестировал пока правда только на простой функции, а не на реальных файлах.
но все таки придется писать для каждого типа возвращаемого значения свою функцию?
и еще вопрос о прикручивании питона внутрь, наивным методом пока остановился вот на чем.
если собрать .exe с вышеобозначенным кодом и перенести на другой компьютер, то пишет 
python.dll не найден, ну доложил в папку dll и теперь пишет ImportError: No module named site.
дальше пока не знаю что делать.
PM MAIL   Вверх
boostcoder
Дата 28.4.2012, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(mrgloom @  28.4.2012,  10:46 Найти цитируемый пост)
 пишет ImportError: No module named site.

потому что интерпретатор должен знать где лежит директория lib с библиотеками пайтона.
по умолчанию, он ищет ее в той же директории где лежит python.dll.

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


Опытный
**


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

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



скопировал папку Lib, где находятся все .py теперь всё работает, я так понимаю что мне достаточно оставить в папке только те .py файлы которые вызывает моя программа?
и еще вопрос запаковать в .exe сразу это все сразу нельзя?
PM MAIL   Вверх
boostcoder
Дата 28.4.2012, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(mrgloom @  28.4.2012,  11:11 Найти цитируемый пост)
мне достаточно оставить в папке только те .py файлы которые вызывает моя программа?

и их зависимости.
PM WWW   Вверх
mrgloom
Дата 28.4.2012, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а как быть, если у меня класс и надо обратится к методу класса?  (в примере myadd3)

Код

class class_cl:
    def __init__(self):
        print("constructor")
    
    def myadd3(self,a):
        print(a)


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


Опытный
**


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

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



хмм но теоретически даже если не получится вызывать метод класса, то наверно можно все self переменные сделать глобальными класс убрать и просто сделать список функций или я не вижу каких то подводных камней?

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


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



не вкурсе.
мало работал с встраиванием пайтоновского интерпретатора в С/С++
PM WWW   Вверх
mrgloom
Дата 28.5.2012, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

void  call_simple_python_func()
{
    Py_Initialize();
    static const char *program = ""   
    "import sys\n"
    "import sys.path\n";
    PyRun_SimpleString(program); 
    Py_Finalize();
}


пробую минимальный код, пишет что нет модуля path ("no module named path")
причем из интерпретатора все работает.

Добавлено через 14 минут и 19 секунд
причем так работает

Код

void  call_simple_python_func()
{
    Py_Initialize();
    static const char *program = "" 
    "import sys\n"
    "from sys import path\n"
    "print sys.path\n";
    PyRun_SimpleString(program); 
    Py_Finalize();
}



но при попытке импортировать socket пишет, пишет что нету _socket.

Код

void  call_simple_python_func()
{
    Py_Initialize();
    static const char *program = ""   
    "import socket\n";  
    PyRun_SimpleString(program); 
    Py_Finalize();
}

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


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



по идее, это должно помочь: http://docs.python.org/c-api/init.html#Py_SetPythonHome
PM WWW   Вверх
mrgloom
Дата 28.5.2012, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



попробовал указать в Py_SetPythonHome папку со скриптами, там же где лежит солюшн, и ничего.

вообщем проблема как тут
http://www.linuxquestions.org/questions/pr...et-mess-699794/
http://bytes.com/topic/python/answers/8031...d-python-script
только переустановка мне не помогла.

что интересно, я заметил, что не находит _socket даже, если положить в папку со скриптами python.exe python27.dll и папку Lib, т.е. что то с путями всё таки скорее всего.

так же пробовал кидать _socket.pyd куда угодно, не находит.

полезный документ нашел
https://www6.software.ibm.com/developerwork...nscript-ltr.pdf

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


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



это все же не раздел по пайтон девелопмингу. лучше подобные специфичные вещи спрашивать в списке рассылки конкретного проенкта.
но, т.к. ты юзаешь boost.python, спроси в списке рассылки [email protected].
PM WWW   Вверх
mrgloom
Дата 28.5.2012, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



это я в начале хотел использовать, а сейчас пользуюсь встроенными питоновскими как в pdf выше,  только проблема с _socket осталась.
скорее всего потому что _socket.pyd лежит не в Lib,а в Dlls.
PM MAIL   Вверх
boostcoder
Дата 28.5.2012, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(mrgloom @  28.5.2012,  16:07 Найти цитируемый пост)
пользуюсь встроенными питоновскими как в pdf

а зачем эта pdf`ка если в оффю доке написано тоже самое? ;)
к тому же, этой теме тем более не место в этом разделе. пиши девелоперам.

PM WWW   Вверх
mrgloom
Дата 28.5.2012, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну вообщем я продолжу поиски решения или обходные пути.



кстати с помощью Py2exe из скрипта я так понимаю можно сделать dll, но как потом к ней обращаться?(особенно если есть входные параметры и выходные)
PM MAIL   Вверх
boostcoder
Дата 28.5.2012, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



слушай.. а какая цель у твоей задачи? писать на пайтон и прикидываться нативной? smile 
PM WWW   Вверх
mrgloom
Дата 29.5.2012, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



у меня есть код на питоне(который я не хочу переписывать на с++) и есть приложение на с++ в которое я хочу встроить данный функционал.
вообщем мне надо из с++ кода вызывать python код, не просто запускать скрипт, а написать как бы обертки для функций на питоне+чтобы можно было подавать и возвращать параметры.

в pdf вроде даже написано как вызывать метод класса, я до этого просто функции пробовал.
причем в release даже вроде работает(хотя может просто не пишет ошибку), а в дебаге я застрял с этим import socket.
попробую еще python portable может прокатит.
PM MAIL   Вверх
mrgloom
Дата 29.5.2012, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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




вроде бы решение  -E флаг для GCC, но какой аналог для линкера студии?
если важно, я линкую статически.

Цитата

http://mail.python.org/pipermail/python-li...uly/624618.html
http://mail.python.org/pipermail/python-li...ust/099835.html
The problem is that the linker has stripped out all the symbols from
your executable, apart from the ones you actually use. When Python
dlopen()s _socket.so, it tries to reference a symbol that has been
stripped. The solution is to tell your linker not to strip the
symbols. With GNU ld, for example, the option is --export-dynamic.


PM MAIL   Вверх
boostcoder
Дата 29.5.2012, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(mrgloom @  29.5.2012,  11:30 Найти цитируемый пост)
-E флаг для GCC

этот флаг, говорит gcc запуститься в режиме препроцессора-only. так что непонятно, какое это имеет отношение к проблеме)
PM WWW   Вверх
mrgloom
Дата 29.5.2012, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



похоже, то что выше относится к этому.
Цитата

Linking Requirements
While the configure script shipped with the Python sources will correctly build Python to export the symbols needed by dynamically linked extensions, this is not automatically inherited by applications which embed the Python library statically, at least on Unix. This is an issue when the application is linked to the static runtime library (libpython.a) and needs to load dynamic extensions (implemented as .so files).

The problem is that some entry points are defined by the Python runtime solely for extension modules to use. If the embedding application does not use any of these entry points, some linkers will not include those entries in the symbol table of the finished executable. Some additional options are needed to inform the linker not to remove these symbols.

Determining the right options to use for any given platform can be quite difficult, but fortunately the Python configuration already has those values. To retrieve them from an installed Python interpreter, start an interactive interpreter and have a short session like this:

>>> import distutils.sysconfig
>>> distutils.sysconfig.get_config_var('LINKFORSHARED')
'-Xlinker -export-dynamic'
The contents of the string presented will be the options that should be used. If the string is empty, there’s no need to add any additional options. The LINKFORSHARED definition corresponds to the variable of the same name in Python’s top-level Makefile.

http://docs.python.org/extending/embedding...ng-requirements


хотя я не очень себе представляю как там эта линковка происходит, тем более что тут описывается для линукса, и во всяком случае
distutils.sysconfig.get_config_var('LINKFORSHARED')
мне не выдал ни одного флага.
PM MAIL   Вверх
boostcoder
Дата 29.5.2012, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(mrgloom @  29.5.2012,  15:25 Найти цитируемый пост)
то что выше относится к этому

что к чему относится? препроцессор к клинковке?
PM WWW   Вверх
mrgloom
Дата 29.5.2012, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



может вы не так поняли(ну или я ), там скорее
Цитата

-export-dynamic 

по описанию делает
Цитата

This instructs the linker to add all symbols, not only used ones, to the dynamic symbol table. This option is needed for some uses of dlopen or to allow obtaining backtraces from within a program. 


вот наверно надо найти аналог для линкера VS.
PM MAIL   Вверх
boostcoder
Дата 29.5.2012, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(mrgloom @  29.5.2012,  16:03 Найти цитируемый пост)
-export-dynamic

что делает эта опция - я знаю.
но это же вы написали:
Цитата(mrgloom @  29.5.2012,  11:30 Найти цитируемый пост)
вроде бы решение  -E флаг для GCC

 smile 

потому я и спрашиваю, какое отношение имеет препроцессор к линковке?

PM WWW   Вверх
mrgloom
Дата 29.5.2012, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну никакого, я смотрел в каком то справочнике и там было -Е а в низу расшифровка -export-dynamic, видимо это была не расшифровка, а просто алфавитный указатель.

так это актуально для виндоус? или это относится только к .so файлам?
PM MAIL   Вверх
boostcoder
Дата 29.5.2012, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



хз-хз..
а проверить не судьба?
PM WWW   Вверх
mrgloom
Дата 30.5.2012, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну так я не знаю какой аналог для линкера VS(в линковке не особо разбираюсь), а на GCC конечно можно проверить, но у меня главный проект завязан на MFC и даже если я всё связанное с питоном выделю в dll, то я так понимаю всё равно будут проблемы при подключении к главному проекту.  


вообще я так понял, что когда пытаешься вызвать import socket из кода на c++, там внутри идет вызов _socket  для которого есть dll _socket.pyd и _socket.lib и они не находятся, я пробовал пихать _socket.lib прямо в проект VS, но ничего не выходит.

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


Опытный
**


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

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



странно, не пойму что сделал, но теперь в релиз версии импорт .pyd идет нормально, зато падает на PyRun_SimpleFile, но только при попытке выполнения .py скрипта, который содержит ссылку на .pyd.
Цитата

PyRun_SimpleFile() crashes on Windows but not on Unix; why?¶
This is very sensitive to the compiler vendor, version and (perhaps) even options. If the FILE* structure in your embedding program isn’t the same as is assumed by the Python interpreter it won’t work.

The Python 1.5.* DLLs (python15.dll) are all compiled with MS VC++ 5.0 and with multithreading-DLL options (/MD).

If you can’t change compilers or flags, try using Py_RunSimpleString(). A trick to get it to run an arbitrary file is to construct a call to execfile() with the name of your file as argument.

Also note that you can not mix-and-match Debug and Release versions. If you wish to use the Debug Multithreaded DLL, then your module must have _d appended to the base name.

дебаг  версия не работает с .pyd файлами, хотя возможно это и не удивительно, т.к. это же с-шные длл-ки, наверно собранные в релиз версии.



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


Опытный
**


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

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



решил писать обертку не для всех функций, а только для тех которые возвращают значение.

не пойму как сделать отступы
Код

if res < 0:
        print("Error: unable to connect")
        return


так не работает
Код

PyRun_SimpleString("if res < 0:\n"
        " print(\"Error: unable to connect\")\n"
        " return");

PM MAIL   Вверх
boostcoder
Дата 31.5.2012, 12:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



смотри пример в первом моем посте.
PM WWW   Вверх
mrgloom
Дата 31.5.2012, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



пытаюсь с помощью sprintf подменить параметры в скрипте.

Код

int sz= strlen("res = test.Connect('localhost', 8300)");
    char* str= new char[sz];
    char* s= "'localhost'";
    int port= 8301;
    sprintf(str,"res = test.Connect(%s, %i)",s,port);

    static const char *program = str;
    delete[] str;//тут пишет heap corruption


что не так?

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


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



mrgloom, 
во-первых - ты что, решил в одной теме задать все интересующие тебя вопросы? правило: одна тема - один вопрос.
во-вторых - ты же на плюсах пишешь и в проекте у тебя используется буст. к чему эти извраты с сями?
Код

#include <iostream>
#include <string>
#include <boost/format.hpp>

int main() {
   const char* s = "'localhost'";
   int port= 8301;
   const std::string str = (boost::format("res = test.Connect(%1%, %2%)") % s % port).str();
   
   std::cout << str << std::endl;
}

http://liveworkspace.org/code/782a0449599b...c278ef60628e767

PM WWW   Вверх
mrgloom
Дата 1.6.2012, 09:30 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



хмм там скорее всего какой то сайд эффект от sprintf.

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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Модератор: Пожалуйста, один топик - один вопрос.
mrgloom, создай новую тему для нового вопроса.


--------------------
...
PM   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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