系统相关
首页 > 系统相关> > Python Popen无法在Windows PowerShell中使用正确的编码

Python Popen无法在Windows PowerShell中使用正确的编码

作者:互联网

我正在Windows PowerShell中运行我的Python脚本,该脚本应使用Popen运行另一个程序,然后将该程序的输出(实际上是Mercural)用在我的脚本中.尝试在PowerShell中执行脚本时出现编码错误.

我很确定这是真的,因为在获取Popen调用的输出时,Python没有使用PowerShell使用的正确编码.问题是我不知道如何告诉Python使用正确的编码.

我的脚本看起来像

# -*- coding: utf-8 -*-
#... some imports
proc = Popen(["hg", "--cwd", self.path, "--encoding", "UTF-8"] + list(args), stdout=PIPE, stderr=PIPE)
#... other code

当我在Linux上运行此脚本时,我没有任何问题.我也可以使用PowerShell在Windows 7 Home Premium 64位中运行脚本,没有任何问题.此Windows 7中的PowerShell使用的是代码页850,即chcp的输出为850(“ ibm850”).

但是,当我使用默认编码为cp437(chcp = 437)的PowerShell在Windows 7 Starter 32位中运行脚本时,我从Python(版本2.7.2)中收到以下错误:

File "D:\Path\to\myscript.py", line 55, in hg_command
    proc = Popen(["hg", "--cwd", self.path, "--encoding", "UTF-8"] + list(args), stdout=PIPE, stderr=PIPE)
File "C:\Program files\Python27\lib\subprocess.py", line 679, in __init__
    errread, errwrite)
File "C:\Program files\Python27\lib\subprocess.py", line 852, in _execute_child
    args = list2cmdline(args)
File "C:\Program files\Python27\lib\subprocess.py", line 615, in list2cmdline
    return ''.join(result)
UnicodeDecodeError: 'utf8' codec cant decode byte 0xe3 in position 0: unexpected end of data

我尝试了以下操作,但没有成功(即上述错误报告保持不变):

>从我的脚本中删除行号-*-编码:utf-8-*-.
>在我的脚本中删除用于通过Popen运行Mercurial的-编码UTF-8选项.
>在执行脚本之前,在PowerShell中将编码更改为chcp 850.
>我在其他Stack Overflow答案中发现了许多其他Python杂项.

对于我的详细信息,我的整个源代码都是here in BitBucket.hgapi.py是给出错误的脚本.

更新:
该脚本由other script调用,该脚本设置了这样的编码

sys.setdefaultencoding("utf-8")

这行看起来很重要,因为如果我注释掉,则会出现另一个错误:

UnicodeDecoreError: 'ascii' codec cant decode byte 0xe3 in position 0: ordinal not in range(128)

解决方法:

尝试将编码更改为cp1252. Windows中的Popen希望将外壳程序命令编码为cp1252.这似乎是一个错误,并且似乎也已通过子流程模块在Python 3.X中进行了修复:http://docs.python.org/library/subprocess.html

import subprocess
subprocess.Popen(["hg", "--cwd", self.path, "--encoding", "UTF-8"] + list(args), stdout=PIPE, stderr=PIPE)

更新:

您的问题也许可以通过Django模块的smart_str函数解决.

使用此代码:

from django.utils.encoding import smart_str, smart_unicode
# the cmd should contain sthe string with the commsnd that you want to execute
smart_cmd = smart_str(cmd)
subprocess.Popen(smart_cmd)

您可以找到有关如何在Windows here上安装Django的信息.
您可以先安装pip,然后再通过启动安装Django
具有管理员特权的命令外壳,然后运行以下命令:

pip install Django

这将在您的Python安装的site-packages目录中安装Django.

标签:unicode,powershell,python,mercurial
来源: https://codeday.me/bug/20191201/2081460.html