У меня 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
, но это не решает мою проблему.
В идеале я хотел бы иметь следующие функциональные возможности:
- Когда я устанавливаю версию Python с помощью кода VS (либо палитры команд, либо строки состояния), если есть встроенный терминал открыт, он должен автоматически переключать версию. Я полагаю, что такая же идея применима к средам, в отличие от версий.
- Когда я запускаю встроенный терминал, он должен запускаться с правильной версией набора. Я в порядке с автоматическим c вызовом соответствующего
activate
файла, если требуется.
Я уверен, что другие vscode-python
пользователи столкнулись с той же проблемой, и из фрагмента кода, решение кажется простым (разрешить поиск в /venv/**/*
); просто хотел посмотреть, может ли быть другой способ достижения моих конечных целей?