Аргументы командной строки запуска кода VS для изменения параметров расширения - PullRequest
0 голосов
/ 16 января 2019

Как указать параметр расширения кода VS при запуске кода VS из командной строки?

В частности, я хочу ввести URI сервера Jupyter в расширение MS Python.

Я могу сделать это после запуска VS Code, выбрав ctrl + shift + P и выбрав Python: Specify Jupyter server URI, затем выбрав Type in the URI for the Jupyter Server и, наконец, введя URI на сервер Jupyter.Описано здесь: https://code.visualstudio.com/docs/python/jupyter-support#_connect-to-a-remote-jupyter-server

У меня уже есть скрипт Powershell, который входит в систему и запускает Jupyter Server на удаленной машине, захватывает URI с токеном аутентификации и автоматически запускает локальный экземпляр любой записной книжки Jupyter.или Лаборатории Jupyter, использующие удаленный сервер Jupyter.

Я также хотел бы иметь возможность запускать VS Code с использованием удаленного сервера Jupyter.Обратите внимание, что URI Jupyter Server меняется каждый раз, когда вы запускаете его на удаленном компьютере.

Каковы аргументы командной строки для запуска VS Code и динамического изменения параметров расширения?

Я не нашел ничегоздесь: https://vscode.readthedocs.io/en/latest/editor/command-line/#additional-command-line-arguments

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Предложение @ 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 будет работать только в том случае, если:

  1. VS Код установлен,
  2. расширение '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.

0 голосов
/ 16 января 2019

Я не уверен, что это возможно с помощью аргументов командной строки. Однако, поскольку это, кажется, настройка, вы можете соответствующим образом изменить settings.json рабочей области перед запуском VSCode:

{
    "python.dataScience.jupyterServerURI": <uri>
}
...