Уведомления

Группа в Telegram: @pythonsu

#1 Июль 17, 2019 02:33:22

lngvar
Зарегистрирован: 2019-07-11
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Объекты Python в чужом процессе

Итак, импортировал я из python27.dll

PyInit = (PY_INITIALIZEEX)GetProcAddress(python27, "Py_InitializeEx");
run_ss = (PYRUN_SIMPLESTRING)GetProcAddress(python27, "PyRun_SimpleString");
auto pyGilStateEnsure = (PyGILState_EnsureFunc*)GetProcAddress(python27, "PyGILState_Ensure");
auto pyGilStateRelease = (PyGILState_ReleaseFunc*)GetProcAddress(python27, "PyGILState_Release");
И теперь наблюдаю совсем другую картину.
Без захваченного гила любая команда = краш.
Это радует, так как ранее у меня без гила все работало, значит я подобрался ближе.
Не радует то, что никакой реакции питона я добиться не смог. Абсолютно никаких действий он не делает.
run_ss("import winsound");
run_ss("winsound.Beep(300, 2000)");
run_ss("handle = open('c:\\output.txt',mode='w',encoding='utf-8')");
run_ss("handle.write('test')");
run_ss("handle.close()");

реакции ноль.
Причем на Py_InitializeEx полный игнор, что с гилом захваченным его вызывать, что без него.
А вот любая другая команда - с гилом - нет реакции, без гила - краш.
Проверил что будет если не освободить гил - краша не было, просто таргет замер. Что в принципе ожидаемо.
Что можете подсказать по этому поводу ? как можно проверить его на живучесть еще ?

p.s. Помоему таргет использует модифицированную python27.dll
Потому что я пробовал в обычном режиме подгрузить ее и залоадить функции и он мне выдает
на PyInit();
ImportError: No module named site
Exception TypeError: "descriptor '__call__' of 'tasklet' object needs an argumen
t" in 'tasklet cleanup' ignored

а когда подсовываю чистую dll из дистрибутива питона - то все работает.
Значит дело труба ?

Отредактировано lngvar (Июль 17, 2019 03:26:10)

Офлайн

#2 Июль 17, 2019 03:23:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Объекты Python в чужом процессе

lngvar
{
HANDLE th;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
th=CreateThread(NULL, 0, &thread1,0, 0, NULL);
break;
}
}
Во, опять кусок какой-то сбросил. Типа “догадывайтесь, ребята, сами, что я там намудрил, а я посижу послушаю”.

Я вот не вижу здесь присоединения к процессу. Может, ты и не присоединился вовсе и пытаешься что-то там доделывать, даже не подключившись.



Отредактировано py.user.next (Июль 17, 2019 03:27:07)

Офлайн

#3 Июль 17, 2019 03:44:06

lngvar
Зарегистрирован: 2019-07-11
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Объекты Python в чужом процессе

py.user.next
Во, опять кусок какой-то сбросил. Типа “догадывайтесь, ребята, сами, что я там намудрил, а я посижу послушаю”.
Этот кусок работает, я уже выполняюсь в контексте таргета.
Но как я уже написал там налицо модифицированная dll. и вот тут я в растерянности

Офлайн

#4 Июль 17, 2019 09:09:49

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Объекты Python в чужом процессе

lngvar
там налицо модифицированная dll. и вот тут я в растерянности
Вы же сами писали что там stackless python. А вы его как cpython используете. это совершенно разные реализации интерпретатора, совместимые на уровне текстов скриптов но не на уровне АПИ. Вы документацию то от stackless используйте.

А так похоже что скоро вы его добъете. Удачи вам в вашем безнадежном предприятии.



Офлайн

#5 Июль 18, 2019 01:14:01

lngvar
Зарегистрирован: 2019-07-11
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Объекты Python в чужом процессе

А вы можете подсказать, почему я так же подключаю python.h 27 версии к своей программе на С как и python.h 34 версии.
Так же подключаю родные для того питона libs, но мне выдает ошибку ImportError: No module named site ?
Это без длл, просто Embedded python.

Может есть какие то нюансы подключения старых версий ? В документации ничего не нашел подобного

Отредактировано lngvar (Июль 18, 2019 01:16:42)

Офлайн

#6 Июль 20, 2019 00:49:01

lngvar
Зарегистрирован: 2019-07-11
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Объекты Python в чужом процессе

Напоследок, хочу уточнить один момент.
Оказывается GIL не лочился.
и возможно поэтому What do PyAPI_FUNC & PyAPI_DATA mean?

Как я понял, эта версия получила какие то приватные объекты, которые не позволяют свободно исполнять Ensure и Release GIL .
Я верно рассуждаю ?

p.s. И все-таки не могу понять,
typedef int( __cdecl * GilG)();
typedef void(__cdecl * GilR)(int);
GilG GilGet = (GilG)GetProcAddress(mod, “PyGILState_Ensure”);
GilR GilRelease = (GilR)GetProcAddress(mod, “PyGILState_Release”);
gg = GilGet();
GilRelease(gg);

В документации написано что PyGILState_STATE это дескриптор, по которому потом освобождается GIL.
В тоже самое время, в инклудах он описывается как перечисление PyGILState_UNLOCKED и PyGILState_LOCKED . Причем мне возвращается UNLOCKED. Это ведь значит не захвачен ?
И в тоже самое время, если я не использую GilRelease(gg) и по окончании потока - таргет моментанльно умирает.Как такое может быть ?
Уточню - я не инициализирую интерпретатор - так как он уже проинициализирован в этом процессе.

Вот еще пример …
PyObject* PyFileObject = PyFile_FromString((char*)“c:\\test.py”, (char*)“r”);
ret=PyRun_SimpleFileEx(PyFile_AsFile(PyFileObject), “c:\\test.py”, 1);
Если файл присутствует - ret=0, иначе -1.
Но он и не думает выполняться. Вернее видимости выполнения нет.
В тоже самое время , Py_GetPath и прочие функции, смысловая нагрузка которая состоит в возвращении данных в с++ - работает. Но команды из PyRun_SimpleString - игнорируются. Но возвращаются тоже либо 0 - если правильная команда, или -1 если намеренно допустил ошибку в питоновском коде.


Отредактировано lngvar (Июль 20, 2019 03:13:21)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version