【发布时间】:2019-07-30 20:13:08
【问题描述】:
所以我试图将几个脚本链接在一起,一些在 powershell (5.1) 中,一些在 python (3.7) 中。
我遇到问题的脚本是用 python 编写的,并通过 sys.stdout.write() 写入标准输出。这个脚本读入一个文件,完成一些处理,然后输出结果。
当这个脚本被自己调用时,也就是说没有输出到任何管道,它会正确执行并写入标准的 powershell 控制台。但是,一旦我尝试以任何方式管道输出,我就会开始出错。
特别是,两个文件具有字符 \u200b 或 zero-width-space。将这些字符的输出打印到控制台是可以的,但尝试通过多种方法将输出重定向到文件:
py ./script.py input.txt > output.txt
py ./script.py input.txt | Set-Content -Encoding utf8 output.txt
Start-Process powershell -RedirectStandardOutput "output.txt" -Argumentlist "py", "./script.py", "input.txt"
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
全部失败:
File "\Python\Python37\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u200b' in position 61: character maps to <undefined>
在python方面,修改脚本删除所有非UTF-8字符也会导致这个脚本失败,所以我有点卡住了。我目前认为问题的发生是由于管道输出如何导致 python 设置不同的环境,但我不确定如何在 python 代码中进行此类修改。
为了完整起见,这里是编写输出的函数。 (注意:file_lines 是一个字符串列表):
import sys
def write_lines(file_lines):
for line in file_lines:
line = list(map(lambda x: '"' + x + '"', line))
line = "".join(entry + ',' for entry in line)
if not line is None:
sys.stdout.write(line + "\n")
【问题讨论】:
-
对于那些感兴趣的人,据我所知,解决这个问题的两种潜在方法是从 python 编写文件,或者删除不符合 cp1252 的字符。我为这种情况做了后者,因为这只影响了两个文件。
标签: python python-3.x powershell io-redirection zero-width-space