diff --git a/duchain/helpers.cpp b/duchain/helpers.cpp --- a/duchain/helpers.cpp +++ b/duchain/helpers.cpp @@ -44,6 +44,8 @@ #include #include #include +#include +#include #include #include @@ -424,6 +426,14 @@ QVector Helper::getSearchPaths(const QUrl& workingOnDocument) { + static bool first = true; + if (first) { + QObject::connect(ICore::self()->runtimeController(), &IRuntimeController::currentRuntimeChanged, ICore::self()->runtimeController(), [](){ + QMutexLocker lock(&Helper::cacheMutex); + cachedSearchPaths.clear(); + }); + } + QMutexLocker lock(&Helper::cacheMutex); QVector searchPaths; // search in the projects, as they're packages and likely to be installed or added to PYTHONPATH later @@ -435,19 +445,20 @@ searchPaths << Helper::projectSearchPaths; searchPaths << Helper::cachedCustomIncludes.value(project); } - + foreach ( const QString& path, getDataDirs() ) { searchPaths.append(QUrl::fromLocalFile(path)); } if ( !cachedSearchPaths.contains(project) ) { + auto runtime = ICore::self()->runtimeController()->currentRuntime(); QVector cachedForProject; qCDebug(KDEV_PYTHON_DUCHAIN) << "*** Collecting search paths..."; - QStringList getpath; - getpath << "-c" << "import sys; sys.stdout.write('$|$'.join(sys.path))"; - + QProcess python; - python.start(getPythonExecutablePath(project), getpath); + python.setProgram(getPythonExecutablePath(project)); + python.setArguments({"-c", "import sys; sys.stdout.write('$|$'.join(sys.path))"}); + runtime->startProcess(&python); python.waitForFinished(1000); QString pythonpath = QString::fromUtf8(python.readAllStandardOutput()); auto paths = pythonpath.split("$|$"); @@ -460,12 +471,12 @@ } else { qCWarning(KDEV_PYTHON_DUCHAIN) << "Could not get search paths! Defaulting to stupid stuff."; - searchPaths.append(QUrl::fromLocalFile("/usr/lib/python" PYTHON_VERSION_STR)); - searchPaths.append(QUrl::fromLocalFile("/usr/lib/python" PYTHON_VERSION_STR "/site-packages")); - QString path = qgetenv("PYTHONPATH"); + searchPaths.append(runtime->pathInHost(Path("/usr/lib/python" PYTHON_VERSION_STR)).toUrl()); + searchPaths.append(runtime->pathInHost(Path("/usr/lib/python" PYTHON_VERSION_STR "/site-packages")).toUrl()); + QString path = runtime->getenv("PYTHONPATH"); QStringList paths = path.split(':'); foreach ( const QString& path, paths ) { - cachedForProject.append(QUrl::fromLocalFile(path)); + cachedForProject.append(runtime->pathInHost(Path(path)).toUrl()); } } qCDebug(KDEV_PYTHON_DUCHAIN) << " *** Done. Got search paths: " << cachedSearchPaths;