Python - 获取命令输出无法解码

2023-12-03

我目前正在开发一个项目,我需要在 powershell 中运行命令,并且部分输出不是英语(特别是希伯来语)。

例如(问题的简化版本),如果我想获取桌面的内容,并且有一个希伯来语文件名:

import subprocess
command = "powershell.exe ls ~/Desktop"
print (subprocess.run(command.split(), stdout=subprocess.PIPE).stdout.decode())

此代码将引发以下错误(或具有不同字节值的类似错误):

UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 19: invalid start byte

尝试在另一台计算机上运行它,这是输出:

?????

知道为什么会这样以及我该如何解决它吗?尝试了很多我在其他问题上看到的东西,但没有一个对我有用。


注:以下是Python 3+ 解决方案,但是有一个caveat:

  • 随着first下面的解决方案还有第二个 - 但是only ifUTF-8 数据必须发送到 PowerShellstdin流 - 由于中的一个错误powershell.exe, the Windows PowerShell CLI, the 当前控制台窗口切换到光栅字体(可能具有不同的字体大小),这确实not支持大多数非扩展 ASCII 范围的 Unicode 字符。虽然视觉上很刺耳,这只是一个display(渲染)问题;数据处理正确;切换回支持 Unicode 的字体,例如Consolas显示正确的输出。

  • 相比之下,pwsh.exe, the PowerShell(核心)(v6+) CLI does not表现出这个问题.


选项 A:配置both控制台and使用PythonUTF-8字符编码before执行你的脚本:

  • 配置console使用 UTF-8:

    • From cmd.exe,通过将活动 OEM 代码页切换为65001(UTF-8);请注意,此更改可能会影响会话中以后对控制台应用程序的所有调用,与 Python 无关,除非您恢复原始代码页(请参阅下面的选项 B):

      chcp 65001
      
    • 来自 PowerShell:

      $OutputEncoding = [Console]::InputEncoding = [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
      
  • And configure Python (v3+) to use UTF-8 consistently:[1]

    • 设置环境变量PYTHONUTF8 to 1, 可能坚持不懈地,通过注册表;去做吧ad hoc:

      • From cmd.exe:

        Set PYTHONUTF8=1
        
      • 来自 PowerShell:

        $env:PYTHONUTF8=1
        
    • 或者,对于单个调用 (v3.7+):传递命令行选项-X utf8 to the python口译员(注:个案事宜):

        python -X utf8 somefile.py ...
      
    • 两个选项均启用Python UTF-8 模式, which 将成为 Python 3.15 中的默认值.

现在,您的原始代码应该按原样工作(显示错误除外)。

Note:

  • A 通过一次性配置步骤实现更简单的替代方案是将您的系统配置为使用UTF-8全系统,在这种情况下,OEM 和 ANSI 代码页都设置为65001。然而,这已经影响深远 - see 这个答案.

选项 B:(暂时)切换到 UTF-8 进行 PowerShell 调用:

import sys, ctypes, subprocess

# Switch Python's own encoding to UTF-8, if necessary
# This is the in-script equivalent of setting environment var. 
# PYTHONUTF8 to 1 *before* calling the script.
sys.stdin.reconfigure(encoding='utf-8'); sys.stdout.reconfigure(encoding='utf-8'); sys.stderr.reconfigure(encoding='utf-8')

# Save the current console output code page and switch to 65001 (UTF-8)
previousCp = windll.kernel32.GetConsoleOutputCP()
windll.kernel32.SetConsoleOutputCP(65001)

# PowerShell now emits UTF-8-encoded output; decode it as such.
command = "powershell.exe ls ~/Desktop"
print(subprocess.run(command, stdout=subprocess.PIPE).stdout.decode())

# Restore the previous output console code page.
windll.kernel32.SetConsoleOutputCP(previousCp)

Note:

  • 由于仅设置output控制台页面,避免了 Windows PowerShell 显示错误.
  • 如果你也想将输入发送到 PowerShellstdin stream,你必须set the input控制台页面也是如此, via windll.kernel32.SetConsoleCP(65001) (which 然后会再次出现显示错误).

[1] This isn't strictly necessary just for correctly decoding PowerShell's output, but matters if you want to pass that output on from Python: Python 3.x defaults to the active ANSI(!) code page for encoding non-console output, which means that Hebrew characters, for instance, cannot be represented in non-console output (e.g., when redirecting to a file), and cause the script to break.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python - 获取命令输出无法解码 的相关文章

随机推荐

  • 如何在 Xamarin 中的视图控制器之间传递数据

    我正在尝试在我的第一个和第二个之间传递一些数据ViewController 我已经实例化了第二个视图控制器 如下所示 RegistrationViewController registration new RegistrationViewC
  • Python 中的 NLP:矢量化后从 SelectKBest 获取单词名称

    我似乎无法找到我的确切问题的答案 有人可以帮忙吗 我的数据框 df 的简化描述 它有 2 列 一列是一堆文本 注释 另一列是一个二进制变量 指示解析时间是否高于平均水平 y 我对文本做了词袋 from sklearn feature ext
  • phpMyAdmin - 无法连接 - 无效设置 - 自从我添加 root 密码以来 - 被锁定

    我运行XAMPP 几天前 我通过 phpmyadmin 设置了 root 密码 从那一刻起我就无法访问 phpMyAdmin 我按照帮助这个链接但那里一切似乎都很好 在 config inc php 中 我什至尝试完全卸载 xampp 重新
  • 旋转动画不适用于 chrome

    我制作的动画可以在 Firefox 上运行 但不能在 Chrome 上运行 我已经尝试了十几种解决方案 但似乎无法使其发挥作用 这是我的代码 path animation name turn transform origin 50px 50
  • 如何在keycloak管理控制台中对客户端进行IP限制

    我在 keycloak 管理控制台中定义了一个客户端 以使用 client credentials 流授权它在我的应用程序中调用服务器到服务器 api 一切都很好 我想对该客户端应用 IP 限制 我可以在管理控制台中的哪里定义此限制 我在k
  • XML 节点的包装组

    我正在使用 PHP5 我需要将 XML 转换为以下形式
  • InvokeExact 对对象,其类型由类加载器动态加载

    我花了一整天的时间来解决这个问题 我的问题是如何对实例进行 MethodHandle invokeExact 调用 该实例的类类型是在程序运行时动态加载的 为了使问题更清楚 我在下面展示了我的示例代码 Class
  • 使用 java applet 查看 .doc 文件

    我有一个网络应用程序 我已经在服务器端生成了 xml 格式的 MS Word 文档 Word 2003 XML 文档 我需要使用某种查看器向客户端用户显示此文档 那么 问题是 我可以使用哪些库来解决这个问题 我需要一个API来在客户端查看w
  • 如何使用xslt将json转换为xml

    如何将 JSON 转换为 XML 考虑
  • 如何使用 Ninject 将 ModelState 作为参数注入?

    我对 Ninject 很陌生 我想找到一种方法将控制器的 Modelstate 进一步传递到服务层 我现在拥有的 private readonly IAccountService service public AccountControll
  • 如何获取R代码表达式中的所有变量?

    如何解码 R 中的表达式以获取涉及的所有变量 例如 如果您有 z lt x y get all variables z 1 x y 您可以使用all vars 但你需要引用你的表达 all vars quote x y 1 x y 你不能只
  • Ninject 模型验证器导致中等信任度问题

    Using 忍者2 2 with ASP NET MVC 3 我有一个控制器和一些位于外部程序集中的类 它们是通过加载NinjectModule来自所述组件 这些模型包含一些验证属性 当对采用具有验证属性的模型的操作执行后操作时 Ninje
  • 如何从安装部署项目中排除 app.config

    如何从安装部署项目中排除 app config 我必须维护 app config 中的加密部分 我知道的唯一 半 嵌入方式是使用 RsaProtectedConfigurationProvider 或 DPAPI 提供程序运行代码 由于我必
  • 如何使decimal.TryParse保留尾随零?

    目前如果我这样做 decimal d temp 22 00 decimal TryParse temp NumberStyles Any CultureInfo InvariantCulture out d 然后 d 结果是 22 有什么方
  • System.Timer elapsed 事件似乎在 .Net 中短时间间隔内延迟触发

    我通过 UART 端口对系统进行采样 然后将信息记录在带有时间戳 包括毫秒 的文件中 如果我以 1 秒的间隔采样 数据会按预期返回 类似于 1 52 45 PM 750 data 1 52 45 PM 750 data 1 52 45 PM
  • r:缺失日期的完整值

    在 R 中 如果我有这些数据 date hour temp 2014 01 05 20 00 00 16 2014 01 06 20 00 00 14 2014 01 06 22 00 00 18 与seq我可以获得日期时间序列 begin
  • JSON如何判断成功与错误?

    我是 JSON 新手 一直在 MVC3 ASP NET 中使用它 但是有人可以阐明如何根据 JSON 结果返回错误吗 我的视图中有以下调用 ajax type POST dataType json url EditJSON data Fil
  • 使用 XMLHttpRequest 加载大型 json 文件 (250mb+)

    虽然我查看了此处和其他来源 但我似乎无法完全找到在 javascript 中使用 XMLHttpRequest 加载更大的 JSON 从文件 的问题 我从 C 应用程序生成此 JSON 文件 并且从未遇到过任何无效 json 的问题 较小的
  • 在 swift 3 中使用计时器自动更改 UIPageViewController 中的页面?

    I have UIPageViewController包含 4 个视图控制器 我设置了自动更改视图控制器的计时器 转到下一个视图控制器 这个计时器和方法将起作用但问题是它仅适用于第一张幻灯片以及应用程序运行时和 5 秒后UIPageView
  • Python - 获取命令输出无法解码

    我目前正在开发一个项目 我需要在 powershell 中运行命令 并且部分输出不是英语 特别是希伯来语 例如 问题的简化版本 如果我想获取桌面的内容 并且有一个希伯来语文件名 import subprocess command power