Я работаю над приложением (для Windows и Mac), которое использует Python в качестве встроенного языка сценариев. а>.
Приложение включает внутренний текстовый редактор, реализованный с помощью Scintilla, а я использую Jedi для автозаполнения, которое обычно отлично работает.
Однако при попытке автодополнения на компьютере, на котором не установлена отдельная установка Python, Jedi выдает ошибку:
jedi.api.environment.InvalidPythonEnvironment
:Не удалось получить информацию о версии для «python»:
FileNotFoundError(2, 'The system cannot find the file specified', None, 2, None)
Копаясь в коде, я вижу, что основной код, который генерирует FileNotFoundError
, возникает, когда джедай пытается запустить python
с помощью subprocess.Popen
. Python не установлен на компьютере, поэтому это не удается.
Я также могу воспроизвести ту же проблему на компьютере, на котором действительно установлен Python, отредактировав переменную среды Path
так, чтобы она не включала местоположение python.exe
.
В идеале мы не хотим, чтобы пользователям нашего приложения приходилось устанавливать Python только для того, чтобы автодополнение работало.
Мои вопросы:
Можно ли заставить Jedi не порождать подпроцессы, а вместо этого запускать свой код внутри того же экземпляра Python, в котором он сам работает? Я не смог найти ничего об этом в документации или исходном коде, относящемся к средам, и экстраполяции из обсуждение здесь Я подозреваю, что ответ может быть отрицательным.
Можно ли каким-то образом заставить Jedi использовать тот же файл
python37.dll
, который использует наше приложение для своей функциональности, вместо того, чтобы искать несуществующий файл.exe
?Можем ли мы каким-то образом сделать минимальную установку Python в нашей существующей установке приложения, которая использует те же библиотеки DLL/Python Lib и т. д.? Как я мог это сделать?
Есть ли другой способ заставить автодополнение Jedi работать в нашем приложении, не требуя от пользователя установки Python или включая полный установщик Python как часть нашего процесса сборки?