$ ./a.py b.xml
这没关系。 a.py读取文件并打印一些东西。
a.py读取
中的参数# Each argument is a file
args = sys.argv[1:]
# Loop on files
for filename in args :
# Open the file
file = open(filename)
我想把它传播到其他脚本。
$ ./a.py b.xml | grep '1)'
这会导致python错误。
这也失败了
$ x=$(./a.py b.xml); echo $x...
如何告诉python不要解释shell脚本语法,如| $()``?
错误是
Traceback (most recent call last):
File "./flattenXml.py", line 135, in <module>
process(file, prefix)
File "./flattenXml.py", line 116, in process
linearize(root, prefix + "//" + removeNS(root.tag))
File "./flattenXml.py", line 104, in linearize
linearize(childEl, path + '/' + numberedTag)
File "./flattenXml.py", line 104, in linearize
linearize(childEl, path + '/' + numberedTag)
File "./flattenXml.py", line 104, in linearize
linearize(childEl, path + '/' + numberedTag)
File "./flattenXml.py", line 104, in linearize
linearize(childEl, path + '/' + numberedTag)
File "./flattenXml.py", line 104, in linearize
linearize(childEl, path + '/' + numberedTag)
File "./flattenXml.py", line 104, in linearize
linearize(childEl, path + '/' + numberedTag)
File "./flattenXml.py", line 83, in linearize
print path + "/@" + removeNS(name) + "=" + val
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 106: ordinal not in range(128)
python脚本来自Python recipes。
答案 0 :(得分:1)
问题是您的文档中包含无法打印到ascii输出流的非ASCII字符。
在内部,python可以处理任何unicode字符,但是当该字符被序列化时,python需要知道要使用哪种表示(utf-8,utf-16或任何一种国际字符编码),以便它可以写出正确的位。
在控制台中运行时,python可以获得终端的编码(我的编码是en_US.UTF-8)并正确设置sys.stdout的编码器。将stdout传递给另一个程序或将stdout重定向到文件时,python不知道该怎么做,并且默认为sys.stdout设置ascii编码器。
在控制台中运行时,编码器通常知道如何将字符转换为终端的正确位,并获得良好的显示效果。管道传输时,ascii编码器无法处理该字符并引发错误。
一种解决方案是在写入stdout之前将所有内容编码为utf-8。
import sys
encoding = sys.stdout.encoding or 'utf-8'
...
print (path + "/@" + removeNS(name) + "=" + val).encode(encoding)
这里,utf-8编码器发送一个字符串,该字符串将通过sys.stdout上仍然存在的ascii编码器并将其传递到另一侧。一个悬而未决的问题是,另一方的程序是否可以处理utf-8。