VS Code - переключение Python версий на встроенный терминал - PullRequest
0 голосов
/ 30 апреля 2020

У меня VS Code v1.44.2 с расширением Microsoft vscode-python, установленным на Windows 10 машине.

Согласно документации vscode-python, он имеет возможность установить правильную версию python во вновь запущенном интегрированном окне терминала.

Эта функциональность работает, вроде как: для меня это работает, только если версия Python, выбранная из средства выбора версий, 3.5.2 - та, которая поставляется с сервером Microsoft ML. Кроме того, он работает, только если запускается встроенный терминал cmd.

Когда эти два узких условия будут выполнены, достаточно точно, как только вы запустите интегрированный терминал, vscode-python запустит /path/to/ML Server/Python/executable/activate.bat, и если вы в дальнейшем выполните python --version в командной строке, вы увидите:

Python 3.5.2 :: Anaconda 4.2.0 (64-bit)

К сожалению, активация среды не работает в случае установки нескольких других Python версий, которые я установил: 2.7.x, 3.6.x, 3.7.x: не включен cmd или gitbash и я подозреваю, что не на многих других оболочках

Глядя на исходный код vscode-python, причина очевидна: vscode-python ищет скрипт activate (activate.bat, activate.sh, activate) в той же папке, что и python.pythonPath, тогда как эти сценарии обычно находятся в подкаталоге python.pythonPath/Lib/venv/scripts.

Соответствующий фрагмент кода из vscode-python repo (src/client/common/terminal/environmentActivationProviders/baseActivationProvider.ts) воспроизведен ниже:

    protected async findScriptFile(pythonPath: string, scriptFileNames: string[]): Promise<string | undefined> {
        const fs = this.serviceContainer.get<IFileSystem>(IFileSystem);
        for (const scriptFileName of scriptFileNames) {
            // Generate scripts are found in the same directory as the interpreter.
            const scriptFile = path.join(path.dirname(pythonPath), scriptFileName);
            const found = await fs.fileExists(scriptFile);
            if (found) {
                return scriptFile;
            }
        }
    }

Этот метод вызывается из src/client/common/terminal/environmentActivationProviders/bash.ts:

   public async getActivationCommandsForInterpreter(
        pythonPath: string,
        targetShell: TerminalShellType
    ): Promise<string[] | undefined> {
        const scriptFile = await this.findScriptFile(pythonPath, this.getScriptsInOrderOfPreference(targetShell));
        if (!scriptFile) {
            return;
        }
        return [`source ${scriptFile.fileToCommandArgument()}`];
    }

    private getScriptsInOrderOfPreference(targetShell: TerminalShellType): string[] {
        switch (targetShell) {
            case TerminalShellType.wsl:
            case TerminalShellType.ksh:
            case TerminalShellType.zsh:
            case TerminalShellType.gitbash:
            case TerminalShellType.bash: {
                return ['activate.sh', 'activate'];
            }
            case TerminalShellType.tcshell:
            case TerminalShellType.cshell: {
                return ['activate.csh'];
            }
            case TerminalShellType.fish: {
                return ['activate.fish'];
            }
            default: {
                return [];
            }
        }
    }

Как видно из этих фрагментов кода, если встроенный терминал gitbash, vscode-python ищет activate.sh или activate в python.pythonPath, но не в его подкаталогах.

Мой онлайн-поиск работы вокруг Я не производил много. Есть некоторые ответы, которые основаны на активации псевдонимов или источников в .bashrc или .bash_profile, но это не решает мою проблему.

В идеале я хотел бы иметь следующие функциональные возможности:

  1. Когда я устанавливаю версию Python с помощью кода VS (либо палитры команд, либо строки состояния), если есть встроенный терминал открыт, он должен автоматически переключать версию. Я полагаю, что такая же идея применима к средам, в отличие от версий.
  2. Когда я запускаю встроенный терминал, он должен запускаться с правильной версией набора. Я в порядке с автоматическим c вызовом соответствующего activate файла, если требуется.

Я уверен, что другие vscode-python пользователи столкнулись с той же проблемой, и из фрагмента кода, решение кажется простым (разрешить поиск в /venv/**/*); просто хотел посмотреть, может ли быть другой способ достижения моих конечных целей?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...