Я пытаюсь использовать Python, чтобы открыть диалоговое окно для ввода ввода в мое приложение на C++.PyObject segfault при вызове функции
Вот очень минимальное представление о том, что я пытаюсь сделать:
#include <iostream>
#include <Python.h>
int main()
{
/* Begin Python Ititialization - only needs to be done once. */
PyObject *ip_module_name = NULL;
PyObject *ip_module = NULL;
PyObject *ip_module_contents = NULL;
PyObject *ip_module_getip_func = NULL;
Py_Initialize();
PyEval_InitThreads();
ip_module_name = PyString_FromString("get_ip");
ip_module = PyImport_Import(ip_module_name);
ip_module_contents = PyModule_GetDict(ip_module);
ip_module_getip_func = PyDict_GetItemString(ip_module_contents, "get_ip_address");
/* End Initialization */
PyGILState_STATE state = PyGILState_Ensure();
PyObject *result = PyObject_CallObject(ip_module_getip_func, NULL);
if(result == Py_None)
printf("None\n");
else
printf("%s\n", PyString_AsString(result));
PyGILState_Release(state);
/* This is called when the progam exits. */
Py_Finalize();
}
Однако, когда я вызываю функцию с PyObject_CallObject, приложение возвращает ошибку сегментации. Я предполагаю, что это потому, что я использую библиотеку Tk. Я попытался связать свое приложение с _tkinter.lib, tk85.lib, tcl85.lib, tkstub85.lib, tclstub85.lib, и ничто из этого не помогает. Я очень озадачен ...
Вот сценарий:
import Tkinter as tk
from tkSimpleDialog import askstring
from tkMessageBox import showerror
def get_ip_address():
root = tk.Tk()
root.withdraw()
ip = askstring('Server Address', 'Enter IP:')
if ip is None:
return None
ip = ip.strip()
if ip is '':
showerror('Error', 'Please enter a valid IP address')
return get_ip_address()
if len(ip.split(".")) is not 4:
showerror('Error', 'Please enter a valid IP address')
return get_ip_address()
for octlet in ip.split("."):
x = 0
if octlet.isdigit():
x = int(octlet)
else:
showerror('Error', 'Please enter a valid IP address')
return get_ip_address()
if not (x < 256 and x >= 0):
showerror('Error', 'Please enter a valid IP address')
return get_ip_address()
return ip
Edit: добавлена мою установку поточной
Это segfault немедленно, не делая ничего? Использует ли ваш код C потоки? – user4815162342
Это segfaults прямо в корне = tk.Tk(). Если я удалю код окна и установил ip на что-то вроде «127.0.0.1», он будет работать по назначению. – Neil
Я использую потоки, есть ли что-то, что мне нужно сделать, прежде чем вызывать мою функцию в дополнение к настройке протектора (PyEval_InitThreads() и т. Д. После PyInitialize())? – Neil