Я пытаюсь запустить сценарий Python с помощью системного вызова через C ++ в Ubuntu. Проблема в том, что эта команда иногда работает, но чаще всего дает сбой и выдает одну из двух ошибок:

sh: 1: Syntax error: EOF in backquote substitution
sh: 1: xK-��: not found

Код, который я использую:

std::string pythonPath = "/home/myuser/Programs/miniconda3/envs/Py37/bin/python3.7";    
std::string viewerScript = "/home/myuser/Projects/Pycharm/MyProject/script.py";
std::string command = pythonPath + " " + viewerScript;
std::thread* t = new std::thread(system, command.c_str());

Есть идеи, что здесь происходит?

1
TheTomer 20 Май 2021 в 14:12

1 ответ

Лучший ответ

Буфер данных, возвращаемый c_str, гарантированно будет действителен только до следующего раза, когда вы получите доступ к строке различными способами, в частности, не уничтожив ее. Так что, если command вот-вот выйдет за пределы области видимости, это гонка между этим потоком, разрушающим буфер, и новым потоком, использующим буфер в system.

Вместо того, чтобы создавать поток с system в качестве точки входа, используйте лямбда, которая принимает строку по значению, поддерживая ее до тех пор, пока system не будет с ней закончен.

std::thread* t = new std::thread([command]() { system(command.c_str()); });
4
Sneftel 20 Май 2021 в 11:22