Как инициализировать Python при запуске программы как службы в Windows?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как инициализировать Python при запуске программы как службы в Windows?

Сообщение Anonymous »

Я создаю сервис на основе SFL (библиотека Service Framework). Когда я работаю из консоли, все в порядке, но когда я запускаю его как службу через "sc start MyService", он выдает фатальные ошибки при вызове Py_Initialize и тому подобное.
Когда программа выходит из строя, в отладчик отправляется следующая строка:

Неустранимая ошибка Python: не удалось получить кодек Python кодировки файловой системы
sc-запрос MyService выводит следующее:

Код: Выделить всё

SERVICE_NAME: MyService
TYPE : 10
WIN32_OWN_PROCESS STATE : 1
STOPPED WIN32_EXIT_CODE : 1077 (0x435)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

Код: Выделить всё

#include "SflBase.h"
namespace nsSFL
{
const CMyService* SflGetServiceApp(void)
{
static T theApp;
return &theApp;
}
}
int _tmain( int argc, LPTSTR* argv )
{
CMyService* pApp = const_cast( SFL_NS SflGetServiceApp() );
nsSFL::CServiceRoot* pServiceMap[] = {
nsSFL::CServiceProxyT::Construct2((TService*)NULL, L"CMyService")
};
int retMain = -1;
if(pApp->PreMain(argc, argv))
retMain = pApp->Main( argc, argv, pServiceMap, ARRAYSIZE(pServiceMap));
pApp->PostMain();
return retMain;
}
BOOL CMyService::PreMain(int argc, LPTSTR* argv)
{
if (!InitInstance(argc, argv))
{
return FALSE;
}
return TRUE;
}
BOOL CMyService::InitInstance(DWORD argc, LPTSTR* lpszArgv)
{
if (!AfxWinInit(::GetModuleHandle(nullptr), nullptr, ::GetCommandLine(), 0))
{
return FALSE;
}
{
PyPreConfig preconfig;
PyPreConfig_InitIsolatedConfig(&preconfig);
preconfig.utf8_mode = true;

status = Py_PreInitialize(&preconfig);
pystatus_exit_on_error(status);
}

// auto pythonPath = L"%localappdata%\\Programs\\Python\\Python38\\python.exe";
auto pythonPath = L"C:\\Program Files\\Python38\\python.exe";
Py_SetPythonHome(pythonPath);
Py_Initialize(); // print "Fatal Python error" only then work as service
}
Свойства проекта: C++20, SDK Windows 10.0.20348.0, Visual Studio 2022 (v143), python 3.8, все x64, boost 1.77
В соответствии с этим вопросом я пытался отключить PYTHONPATH и PYTHONHOME, но он был недоступен в системе, поэтому я установил эти переменные (ошибка осталась) и удалили их из переменных среды (ошибка осталась).
В соответствии с этим вопросом я попытался назначить Py_SetPythonHome, но не путь к "C:\Program" Ни Files\Python38\python.exe", ни "%localappdata%\Programs\Python\Python38\python.exe" никак не повлияли на ошибку.
Использование PyConfig_InitIsolatedConfig/PyConfig_InitPythonConfig также не решило проблему.
Я думаю, проблема связана с некоторыми ограничениями LocalSystem, хотя NetworkService вообще отказывается запускаться, а LocalService не подходит, так как я нужно работать с портами. Возможно, мне стоит настроить какие-то права доступа, но я понятия не имею, как и даже где найти информацию.

Подробнее здесь: https://stackoverflow.com/questions/791 ... in-windows
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»