Предложение @ Gama11 сработало, поэтому их ответ - принятый ответ.
Я изменил настройку в сохраненных рабочих пространствах кода вместо глобальных настроек кода. Я также добавил некоторую логику для запуска новой рабочей области кода в папке, из которой вызывается этот скрипт. Таким образом, каждое рабочее пространство может иметь свой собственный отдельный сервер ноутбуков Jupyter.
Для полноты ниже приведен мой скрипт Powershell.
РЕДАКТИРОВАТЬ , чтобы отразить последние изменения в ядре vscode и то, как оно сохраняет ссылки на файлы рабочей области. Возможно, лучший способ сделать это, но этого будет достаточно.
## Set $remoteName to either remote server IP or network name
# $remoteName = "111.111.111.111"
$remoteName = "ServerNetworkName"
$cred = Get-Credential -UserName "$env:username" -Message "network username and password"
$jobname = Read-Host 'Enter a name for the remote job'
$s2 = New-PSSession -ComputerName $remoteName -Name $jobname -Credential $cred
if ($s2 -eq $null){
Write-Host "Log in failed"
sleep 3
Exit
}
Invoke-Command -Session $s2 -ScriptBlock {
$env:PYTHONPATH = "C:\Users\UserName\Miniconda3";
$env:Path += ";C:\Users\UserName\Miniconda3";
$env:Path += ";C:\Users\UserName\Miniconda3\Library\mingw-w64\bin";
$env:Path += ";C:\Users\UserName\Miniconda3\Library\usr\bin";
$env:Path += ";C:\Users\UserName\Miniconda3\Library\bin";
$env:Path += ";C:\Users\UserName\Miniconda3\Scripts";
$env:Path += ";C:\nltk_data";
$env:Path += ";C:\Users\UserName\scripts";
C:\Users\UserName\scripts\AdditionalSettingsFile.ps1;
cd "C:\Users"
}
$jnCommand = [scriptblock]::Create("jupyter lab --no-browser --ip=$remoteName")
$jn = Invoke-Command -Session $s2 -ScriptBlock $jnCommand -AsJob
$jo = $null
$timeout = new-timespan -Seconds 30
$sw = [diagnostics.stopwatch]::StartNew()
do{
Receive-Job -Name $jn.Name -Keep -ErrorVariable jo
$jo = $jo | select-string "URLs:" | Out-String
$jnRunning = $jo.Contains("URLs:")
sleep 2
}until(($jnRunning -eq $True) -or ($sw.elapsed -ge $timeout))
$splt = "URLs:", ""
$option = [System.StringSplitOptions]::RemoveEmptyEntries
$jurl = $jo.split($splt, 2, $option)[1].Trim()
## -IdleTimeoutSec in sec/min * min/hr * hrs/day * days
## 60*60*24*3 = 259200
Disconnect-PSSession -Session $s2 -IdleTimeoutSec (60*60*24*3)
$WorkSpacesPath = "C:\Users\UserName\AppData\Roaming\Code\User\workspaceStorage"
$wsArray = (
Get-Item -Path $CodeWorkSpaces\*\*.json | `
Foreach-Object {
(Get-Content ($_.FullName) | ConvertFrom-Json).configuration `
-Replace 'file:///|[\s]+', '' `
-Replace '/', '\' `
-Replace '%3a', ':' `
-Replace '%20', ' ' `
}
) | `
Where-Object { $_ } | `
Get-Unique -AsString | `
Foreach-Object {
Get-Item -Path $_ -EA SilentlyContinue | `
Select-Object -Property BaseName, FullName, LastAccessTime `
} | `
Sort-Object -Property LastAccessTime
## BEGIN EDIT
$wsArray += (
(Get-Item -Path $CodeWorkSpaces\*\*.json | `
Foreach-Object {
(Get-Content ($_.FullName) | ConvertFrom-Json).configuration.fsPath `
}
) | `
Where-Object { $_ } | `
Get-Unique -AsString | `
Foreach-Object {
Get-Item -Path $_ -EA SilentlyContinue | `
Select-Object -Property BaseName, FullName, LastAccessTime `
} | `
Sort-Object -Property LastAccessTime `
)
## END EDIT
$cwd = Get-Location
$NewSettings = [PSCustomObject]@{BaseName="New Workspace"; FullName=$cwd; LastAccessTime=Get-Date}
$wsArray += $NewSettings
$idx = 0
$wsArray | Foreach-Object {$_ | Add-Member @{Index = $idx } -Force; $idx++ }
$wsArray | Select-Object -Property Index, BaseName, LastAccessTime | Format-Table *
$idxSel = Read-Host 'Select workspace index'
$SelPath = $wsArray[$idxSel].FullName
$SelName = $wsArray[$idxSel].BaseName
if ($SelName -eq $NewSettings.BaseName) {
if ($jurl -eq $null) {$jurl = "local"}
[PSCustomObject]@{
"python.dataScience.jupyterServerURI"=$jurl
} | `
ConvertTo-Json | `
Set-Content ("$SelPath\.vscode\settings.json")
code .
} else {
$SelCont = Get-Content($SelPath) | ConvertFrom-Json
$SelCont.settings | `
Add-Member `
-NotePropertyName "python.dataScience.jupyterServerURI" `
-NotePropertyValue $jurl `
-Force
$SelCont | ConvertTo-Json | Set-Content ($SelPath)
code $SelPath
}
Последняя часть скрипта после $WorkSpacesPath
будет работать только в том случае, если:
- VS Код установлен,
- расширение 'ms-python.python' установлено и включено,
Очевидно, вам нужно будет изменить дополнения к $PATH
пульта, чтобы указать вашу установку python и расположение других файлов, которые вы хотите запустить на удаленной машине.
Обратите внимание, что select-string "URLs:"
и .Contains("URLs:")
работают для самой последней (относительно этой публикации) версии Jupyter. Ранее строка была "token:"
, но команда Jupyter изменила вывод запуска. Ничто не мешает им изменить его снова и взломать код выше.
Это можно легко изменить, чтобы запускать лаборатории Jupyter вместо VS Code. Для этого просто замените строки после $CodeSettingsPath
следующим (при условии, что у вас установлен Google Chrome).
Start-Process chrome.exe --app=$jurl
Если вы хотите запустить ноутбук Jupyter, вам нужно заменить lab
на notebook
в переменной $jnCommand
.