@@ -88,6 +88,16 @@ void PythonQt::init(int flags, const QByteArray& pythonQtModuleName)
8888 _self->_p ->_pySourcelessFileLoader = importlib.getVariable (" SourcelessFileLoader" );
8989 }
9090
91+ #ifdef PY3K
92+ PythonQtObjectPtr asyncio;
93+ asyncio.setNewRef (PyImport_ImportModule (" asyncio" ));
94+ if (asyncio)
95+ {
96+ _self->_p ->_pyEnsureFuture = asyncio.getVariable (" ensure_future" );
97+ _self->_p ->_pyFutureClass = asyncio.getVariable (" Future" );
98+ }
99+ #endif
100+
91101 PythonQt::priv ()->setupSharedLibrarySuffixes ();
92102
93103 PythonQtMethodInfo::addParameterTypeAlias (" QObjectList" , " QList<QObject*>" );
@@ -406,6 +416,46 @@ void PythonQtPrivate::setTaskDoneCallback(const PythonQtObjectPtr & callable)
406416 _pyTaskDoneCallback = callable;
407417}
408418
419+ PythonQtObjectPtr PythonQtPrivate::checkAndRunCoroutine (const PythonQtObjectPtr& object)
420+ {
421+ PythonQtObjectPtr result;
422+ #ifdef PY3K
423+ if (!PyCoro_CheckExact (object))
424+ {
425+ return result;
426+ }
427+
428+ if (!_pyEnsureFuture)
429+ {
430+ std::cerr << " PythonQt: ensure_future not initialized" << std::endl;
431+ return PythonQtObjectPtr ();
432+ }
433+ PyObject* args = PyTuple_New (1 );
434+ PyObject* coro = object.object ();
435+ Py_INCREF (coro);
436+ PyTuple_SetItem (args, 0 , coro);
437+ PyObject* r = PyObject_CallObject (_pyEnsureFuture, args);
438+ result.setNewRef (r);
439+ if (_pyTaskDoneCallback) {
440+ PyObject* methodName = PyUnicode_FromString (" add_done_callback" );
441+ PyObject_CallMethodObjArgs (r, methodName, _pyTaskDoneCallback.object (), nullptr );
442+ Py_XDECREF (methodName);
443+ }
444+ Py_XDECREF (args);
445+ #endif
446+ return result;
447+ }
448+
449+ PythonQtObjectPtr PythonQtPrivate::createAsyncioFuture ()
450+ {
451+ if (!_pyFutureClass)
452+ {
453+ std::cerr << " PythonQt: _pyFutureClass not initialized" << std::endl;
454+ return nullptr ;
455+ }
456+ return _pyFutureClass.call ();
457+ }
458+
409459void PythonQt::setRedirectStdInCallback (PythonQtInputChangedCB* callback, void * callbackData)
410460{
411461 if (!callback) {
0 commit comments