我使用VSCode 每当我安装Python库时,都会收到以下通知:

警告:脚本Auto-py-to-exe.exe和autopytoexe.exe为 安装在不在路径上的‘C:\Users\PC\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\Scripts’中

但我把它加到路径上了. 如果我跑:

echo $env:PATH

我得到

C:\Users\PC\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\Scripts:C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Users\PC\AppData\Local\Microsoft\WindowsApps;C:\Users\PC\AppData\Local\Programs\Microsoft VS Code\bin;C:\texlive\2023\bin\windows

这表明我已经添加了上述路径.

我很困惑,因为我不能直接从CLI运行包,即使导入它们是可行的.

我手动添加了路径,并try 删除它,但这不起作用. 有什么 idea 吗?

推荐答案

您自己的解决方案原则上是有效的—101 is the required separator on Windows—除了您的语句不是有效的PowerShell代码,以及\个字符.在PowerShell中不需要转义为\\;此外,您可以使用LOCALAPPDATA environment variable更一般地表示新目录路径;因此:

$newDir = "$env:LOCALAPPDATA\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\Scripts"
$env:PATH = "$newDir;$env:PATH" 

The above modifies $env:PATH only for the current session (process).
To also persist this change on Windows - so that future sessions see it too:

  • Interactively,运行sysmd.cpl, Select Advanced选项卡,然后单击Environment Variables...,然后将值$newDir添加到所需的作用域中;由于您的目录路径是user-specific,所以将其添加到User variables for <username>列表中.

  • Programmatically,这是令人惊讶的难做到robustly:

    • If you don't mind converting the original 101 definition to a static 102 one,你可以使用[Environment]::SetEnvironmentVariable()(为了目标变量的machine级定义,将'User'更改为'Machine',但不是说这样做需要elevation(以管理员身份运行):

      [Environment]::SetEnvironmentVariable(
        'PATH',
        ($newDir + ';' + [Environment]::GetEnvironmentVariable('PATH', 'User')), 
        'User'
      ) 
      
    • 虽然这个typically没有不良影响,但是它can;参见this answer以了解背景信息和鲁棒替代;this answer将鲁棒替代包装在辅助函数Add-Path中,并解释了为什么对于PATH个更新应该避免setx.exe.

    • 一个更简单的编程替代方案,也适用于类Unix平台,是将上述语句添加到您的$PROFILE文件中,但请注意,只有PowerShell会话和从它们启动的程序才会看到更新的PATH,并且可以通过-NoProfile CLI参数(PowerShell CLI(powershell.exe -NoProfile用于Windows PowerShellpwsh -NoProfile用于PowerShell (Core) 7+)启动PowerShell会话来 suppress 配置文件加载.

注意.NET cannot offer APIs for persistent environment-variable definitions on Unix-like platforms,因为没有unified机制贯穿所有这些机制.


Cross-platform background information on the PATH environment variable:

  • 在特殊100 environment variable中存储的目录路径列表中使用的platform-specific separator是:

    • ;Windows
    • :在类似Unix的平台上
  • In cross-platform scripting, make changes to 100 as follows在PowerShell中:

    • 使用$env:PATH—全为零—因为环境变量访问在类似Unix的平台上是case—sensitive,而特殊变量的名称确实是PATH.

      • Windows上,正式名称是Path,但因为环境变量访问是case—insensitive,所以任何case变体和PATH都可以工作.
    • 使用—混淆命名—[System.IO.Path]::PathSeparator属性获取平台原生分隔符.

    • 在构造directory paths进行添加时,使用本机平台file-system path separator,.NET在同样不幸地命名为-[System.IO.Path]::DirectorySeparatorChar属性中反映了这一点.

      • PowerShell的Join-Path cmdlet和. NET的[System.IO.Path]::Combine()方法,当给定路径components时,implicitly使用平台原生分隔符,在Windows上是\,在类Unix平台上是/.

        • 请注意,\在PowerShell中有no的特殊含义(在cmd.exe中两者都没有),因此no需要将literal\字符表示为\\(但是,在文件系统路径的上下文中,这种意外重复的分隔符通常仍然可以接受).
      • Windows上,您也可以 Select 使用/,这在PATH的上下文中以及PowerShell原生命令中使用是安全的.

        • .NET通过[System.IO.Path]::AltDirectorySeparatorChar属性反映了这一事实

        • 然而,程序/脚本判断$env:PATH中的existing个条目很可能假设\,所以最好使用平台原生分隔符.

        • 此外,一般来说,仍然存在/ doesn't工作的Windows上下文,例如cmd.exe和COM API.

    • 一般来说,目标是用environment/well-known目录来表达你的目录路径,要解析为literals个路径at the time of adding个条目:

      • 例如,路径C:\Users\PC\AppData\Local部分可以替换为环境变量$env:LOCALAPPDATA

      • 然而,对于cross-platform使用,最好使用platform-agnostic abstractions,在限制范围内—由[System.Environment]::GetFolderPath()

        • 例如,上述与平台无关的类似功能是:

          [Environment]::GetFolderPath('LocalApplicationData')
          
      • 由于[System.Environment]::GetFolderPath()的使用对PowerShell不是很友好,GitHub issue #6966要求通过单独的名称空间/提供程序(例如$sf:LocalApplicationData(sf代表s特殊f旧)来显示已知文件夹.

Python相关问答推荐

Python 3.12中的通用[T]类方法隐式类型检索

如何计算两极打印机中 * 所有列 * 的出现次数?

从收件箱中的列中删除html格式

对整个 pyramid 进行分组与对 pyramid 列子集进行分组

在Google Colab中设置Llama-2出现问题-加载判断点碎片时Cell-run失败

Mistral模型为不同的输入文本生成相同的嵌入

计算组中唯一值的数量

使用密钥字典重新配置嵌套字典密钥名

计算每个IP的平均值

在ubuntu上安装dlib时出错

当递归函数的返回值未绑定到变量时,非局部变量不更新:

如何使用scipy的curve_fit与约束,其中拟合的曲线总是在观测值之下?

如何禁用FastAPI应用程序的Swagger UI autodoc中的application/json?

剪切间隔以添加特定日期

基于多个数组的多个条件将值添加到numpy数组

pysnmp—lextudio使用next()和getCmd()生成器导致TypeError:tuple对象不是迭代器''

如何在Python 3.9.6和MacOS Sonoma 14.3.1下安装Pyregion

Polars定制函数返回多列

Numpy`astype(Int)`给出`np.int64`而不是`int`-怎么办?

Sknowled线性回归()不需要迭代和学习率作为参数