【问题标题】:VS Code launch command line arguments to change extension parametersVS Code 启动命令行参数以更改扩展参数
【发布时间】:2019-06-09 22:54:02
【问题描述】:

从命令行启动 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 服务器,使用身份验证令牌捕获 URI,并使用远程 Jupyter 服务器自动启动 Jupyter 笔记本或 Jupyter 实验室的本地实例.

我还想选择使用远程 Jupyter 服务器启动 VS Code。请注意,每次在远程计算机上启动 Jupyter 服务器 URI 都会发生变化。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      @Gama11 的建议奏效了,所以他们的答案是公认的答案。

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

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

      EDIT 以反映最近对 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 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 笔记本,则需要将 $jnCommand 变量中的 lab 替换为 notebook

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-23
        • 2019-05-09
        • 1970-01-01
        • 2021-12-02
        • 2013-06-13
        相关资源
        最近更新 更多