VISWESWARAN1998 Ответов: 2

Проблема с внедрением Python на C++


Доброе утро сэр,
Я готов встроить Python в свое приложение на C++, для этого я сослался на несколько статей на этом сайте. Наконец, я добился некоторого успеха во внедрении python в свое приложение.


const char* file_location = location.c_str();
FILE* file_pointer;
// Initialize the Python interpreter
Py_Initialize();
file_pointer = _Py_fopen(file_location, "r");
// Run the Python file
PyRun_SimpleFile(file_pointer, file_location);
// Finalize the Python interpreter
Py_Finalize();


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

print("Testing the woking from Python file")
print("works good...")
print(1+2)


Но когда я пытаюсь импортировать какие либо модули например tkinter даже базовая программа выдает исключение,

Эта программа бросает,

from tkinter import *
root = Tk()
root.mainloop()


AttributeError: модуль 'sys' не имеет атрибута 'argv'

Я использую Python 3.5.2 и VS2015

Сам Процесс Происходит:

Это метод, который выполняет файл Python,

bool pycompile::execute_python(std::string location)
{
	if (std::ifstream(location))
	{
		try {
			const char* file_location = location.c_str();
			FILE* file_pointer;
			// Initialize the Python interpreter
			Py_Initialize();
			file_pointer = _Py_fopen(file_location, "r");
			// Run the Python file
			PyRun_SimpleFile(file_pointer, file_location);
			// Finalize the Python interpreter
			Py_Finalize();
		}
		catch (...)
		{
			std::cout << "exception";
		}
		return true;
	}
	return false;
}


Что делает приведенный выше код


Как только местоположение файла передано, он выполняется

Содержимое файла Python 1:

print("Python from C++")


Результат:

хорошо работать

тест 2 с другим файлом



from tkinter import *
root = Tk()
root.mainloop()


Я получаю эту ошибку,
Цитата:
корень = Tk()
Файл "C:\Users\User\AppData\Local\Programs\Python\Python35-32\Lib\tkinter\__init__.py", строка 1863, in _ _ init__
базовое имя = ОС.путь.базовое имя(sys файла.аргумент argv[0])
AttributeError: модуль 'sys' не имеет атрибута 'argv'


Что я уже пробовал:

То, что я пробовал, это :

1. Упоминается Google и нашел кое какую информацию, как убедившись, что питон-в путь., и т. д.,

2. Скопировать и вставить как dll файлы tk86t.dll и tcl86t.dll для tkinter рядом с исполняемый файл, но ничего не работает.

Я не знаю сэр что делать любезно помогите мне Спасибо

2 Ответов

Рейтинг:
5

Albert Holguin

Похоже, что список аргументов не определен, и я не уверен, что этот нюанс является общим для всех "встроенных" версий Python (то есть вы вызываете Python через API, а не запускаете его изначально).... но вы можете обойти эту проблему, установив список argv с помощью вызова PySys_SetArgv() :
c++ - "AttributeError: объект 'module' не имеет атрибута 'argv' " при использовании Python.h-Stack Overflow[^]


[no name]

Спасибо вам, сэр, за ваше решение, PySys_SetArgv() действительно работает, и я запускаю скрипты python. Огромное спасибо.

Member 14169974

Привет, не могли бы вы загрузить свой код, который используется для решения этой проблемы? Я пытался :
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
PySys_SetArgv(argc, argv);
}
и я получил ошибку:
/главная/Стефан/QtObjects/Vispy_based_MeshLab Майне.КПП:47: ошибка: невозможно преобразовать 'char*, так*' до 'тип wchar_t**' для параметра '2' на 'пустоту PySys_SetArgv(инт, тип wchar_t**)'
PySys_SetArgv(argc, argv);
Я не знаю, как решить эту проблему,пожалуйста, помогите мне, сэр.

Рейтинг:
19

[no name]

сэр, я пробовал Py_SetProgramName, но это тоже не помогает

Richard MacCutchan

Вы все еще не показали код, в котором происходит ваша ошибка. Нет смысла просто гадать, что добавление какой-то случайной строки кода решит вашу проблему. Вам нужно точно диагностировать, что именно не работает.

[no name]

серьезно, код, опубликованный в моем вопросе, - это то, что я на самом деле пробовал, это ошибка baseName = os. path. basename(sys. argv[0])
AttributeError: модуль 'sys' не имеет атрибута 'argv'

Richard MacCutchan

Этот код нигде не появляется в вашем вопросе, отсюда и мои комментарии.

Так что же такого в сообщении об ошибке, что вы не понимаете? В нем совершенно ясно говорится, что sys не имеет атрибута с именем argv Что такое sys и где это определено?

Пожалуйста, отредактируйте свой вопрос и покажите все детали, связанные с вашей ошибкой, а не несколько случайных строк кода, которые с ней не связаны.

[no name]

сэр
из Tkinter import *
корень = Tk()
корень.mainloop()

Эти три строки кода на самом деле содержатся в файле. Ничего больше, только три строки, когда я пытаюсь выполнить его, показывает ошибка. Больше я ничего не определил. Я запустил только три строки кода в тестировании

Richard MacCutchan

Так где же та строка кода, которая содержит ошибку? Помните, что мы не можем видеть ваш экран, поэтому мы понятия не имеем, где происходит эта ошибка.

[no name]

сэр, я обновил вопрос, объяснив процесс более кратко. Спасибо за ваше время

Richard MacCutchan

Это, кажется, работает в моей системе в интерактивном режиме, но, очевидно, что-то не работает при запуске python на C++. Я могу только предложить обратиться за дополнительной помощью на один из специализированных форумов python.

Albert Holguin

Похоже, это "встроенная" проблема Python (или нюанс)...

Richard MacCutchan

Ответ находится в результатах поиска Google. Атрибут sys.argv устанавливается оболочкой Python, поэтому, если скрипт запускается в другом месте, то argv не создается.

[no name]

Я использовал PySys_SetArgv для установки аргументов, и программа, наконец, заработала. Огромное спасибо