Форум сайта python.su
Итак, импортировал я из 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()");
ImportError: No module named site
Exception TypeError: "descriptor '__call__' of 'tasklet' object needs an argumen
t" in 'tasklet cleanup' ignored
Отредактировано lngvar (Июль 17, 2019 03:26:10)
Офлайн
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)
Офлайн
py.user.nextЭтот кусок работает, я уже выполняюсь в контексте таргета.
Во, опять кусок какой-то сбросил. Типа “догадывайтесь, ребята, сами, что я там намудрил, а я посижу послушаю”.
Офлайн
lngvarВы же сами писали что там stackless python. А вы его как cpython используете. это совершенно разные реализации интерпретатора, совместимые на уровне текстов скриптов но не на уровне АПИ. Вы документацию то от stackless используйте.
там налицо модифицированная dll. и вот тут я в растерянности
Офлайн
А вы можете подсказать, почему я так же подключаю python.h 27 версии к своей программе на С как и python.h 34 версии.
Так же подключаю родные для того питона libs, но мне выдает ошибку ImportError: No module named site ?
Это без длл, просто Embedded python.
Может есть какие то нюансы подключения старых версий ? В документации ничего не нашел подобного
Отредактировано lngvar (Июль 18, 2019 01:16:42)
Офлайн
Напоследок, хочу уточнить один момент.
Оказывается 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)
Офлайн