【发布时间】:2020-02-19 16:50:09
【问题描述】:
我目前正在将脚本从 Perl 迁移到 Python3 (3.6.5)。正在 Windows Server 2016 上运行。脚本使用参数构建命令行并使用 subprocess.check_output 执行创建的字符串。其中一个参数选项称为-location:"my street"。该位置可以包含特殊字符,例如变音符号 (äöß) 或 (áŠ)。
当我运行 Perl 脚本时,特殊字符会正确传递给应用程序。当我运行 Python 脚本时,特殊字符被应用程序中的问号替换。我认为被调用的应用程序需要一个 UTF-8 编码的参数字符串。
Perl 脚本以 UTF-8 模式运行
use UTF8;
binmode( STDOUT, ":utf-8" );
Python 脚本是用 PyCharm 创建的,UTF-8 编码,脚本的第一行包含
# -*- coding: utf-8 -*-
我尝试了几种方法将子进程参数的编码设置为 UTF-8,但没有奏效。我使用procmon.exe 来比较Perl 和Python 脚本之间的应用程序调用。我可以看到,在 procmon 中为 Python 子进程调用显示的命令行对我来说是可读的。工作的 Perl 调用不是。在 procmon 中查找 perl 脚本的位置字符串如下所示:
-location:"HQ/äöööStraße".
Perl 代码如下所示:
$command = "C:\\PROGRAM FILES\\Application\\bin\\cfg.exe"
$operand = "-modify -location:123á456ß99"
$result = `$command $operand`;
Python 代码如下所示:
# -*- coding: utf-8 -*-
import subprocess
result = subprocess.check_output(['C:\\PROGRAM FILES\\Application\\bin\\cfg.exe', "-modify", "-location:123á456ß99"], shell=False, stderr=subprocess.STDOUT)
知道我必须做什么才能将 python 参数正确传递给应用程序吗?
【问题讨论】:
-
你真的希望
stderr包含stdout吗? -
你试过
loc_str.encode('utf-8')。这里loc_str是带有该位置参数的字符串,然后传递给子进程
标签: python python-3.x perl