#python #c #python-embedding
#python #c #python-встраивание
Вопрос:
Я написал этот код, чтобы изменить рабочий каталог python на каталог c :
Py_Initialize();
// Get the c working directory
QString working_directory = QFileInfo(".").absolutePath();
qDebug() << "C wd: " << working_directory;
PyRun_SimpleString("import os");
// Import the os module
PyObject* pyOSModule = PyImport_ImportModule("os");
// Convert the std::string to c string
const char * wdCString = working_directory.toStdString().c_str();
// Create python working directory string
PyObject* pyWd = PyUnicode_FromString(wdCString);
// The chdir function of the os module
PyObject* pyChdirFunction = PyObject_GetAttrString(pyOSModule,(char*)"chdir");
// Call the chdir method with the working directory as argument
PyObject_CallFunction(pyChdirFunction, "s", pyWd);
PyRun_SimpleString("print('Python wd: ' os.getcwd())");
Вывод:
C wd: "Q:/Q/UVC Luftreinigungsanlage/System/Air Purification Management System"
OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: 'x01'
Самое странное, что с обычной оболочкой python «Q:/Q/UVC Luftreinigungsanlage /System / Система управления очисткой воздуха» является допустимой строкой для os.chdir(), и это работает, но я не вижу никакой разницы в этом, вызываемом с помощью Python.библиотека h.
Комментарии:
1. Результатом
working_directory.toStdString()
является временное значение,c_str()
значение которого исчезло вместе с ним. Попробуйте другой метод получения строки в стиле C.2. В Linux рассмотрите возможность использования getcwd(2) из вашего кода на C . См. Также библиотеку POCO
3. С Qt вы могли бы использовать QDir::current
Ответ №1:
wdCString
является висячим указателем — working_directory.toStdString()
это временный объект, время жизни которого закончилось на следующей строке.
Вы можете либо продлить срок его службы,
const std::stringamp; wd = working_directory.toStdString();
const char * wdCString = wd.c_str();
или передать указатель напрямую,
PyObject* pyWd = PyUnicode_FromString(working_directory.toStdString().c_str());
Комментарии:
1. Я изменил его, но он по-прежнему выдает ошибку. Также я могу превратить pyWd обратно в QString и распечатать его, и это все еще ожидаемый путь, поэтому он, очевидно, не был уничтожен.
2. @532465747 Вы не можете определить, является ли объект действительным путем проверки. Неопределенное поведение неприятно.
3. хорошо, но, к сожалению, это все равно не работает, выдает ту же ошибку