VS Code启动命令行参数以更改扩展参数

时间:2019-01-15 21:32:55

标签: python powershell visual-studio-code jupyter-notebook vscode-settings

从命令行启动VS Code时如何指定VS Code扩展参数?

具体地说,我想将Jupyter服务器的URI输入到MS Python扩展中。

我可以在VS Code启动之后执行此操作,方法是选择ctrl + shift + P并选择Python: Specify Jupyter server URI,然后选择Type in the URI for the Jupyter Server,最后输入到Jupyter服务器的URI。在此处描述:https://code.visualstudio.com/docs/python/jupyter-support#_connect-to-a-remote-jupyter-server

我已经有一个Powershell脚本,该脚本登录并在远程计算机上启动Jupyter Server,使用身份验证令牌捕获URI,并使用远程Jupyter Server自动启动Jupyter Notebook或Jupyter Labs的本地实例。

我还希望可以选择使用远程Jupyter服务器启动VS Code。请注意,Jupyter Server URI每次在远程计算机上启动时都会更改。

启动VS Code并动态更改扩展参数的命令行参数是什么?

我在这里没有找到任何东西: https://vscode.readthedocs.io/en/latest/editor/command-line/#additional-command-line-arguments

2 个答案:

答案 0 :(得分:1)

我不确定是否可以通过命令行参数来实现。但是,由于这似乎是一个设置,因此您可以在启动VSCode之前相应地修改工作区的settings.json

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

答案 1 :(得分:1)

这是@ Gama11的建议起作用的,所以他们的答案就是被接受的答案。

我更改了已保存的代码工作区中的设置,而不是全局代码设置。我还添加了一些逻辑以在调用此脚本的文件夹中启动新的代码工作区。这样,每个工作区都可以拥有自己的独立Jupyter笔记本服务器。

为完整起见,以下是我的Powershell脚本。

编辑,以反映对vscode core的最新更改以及它如何保存对工作区文件的引用。也许是一种更好的方法,但这足够了。

## 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 Code,
  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