如何管道读取其他shell脚本的参数的python脚本的输出?

时间:2013-10-03 19:51:27

标签: python shell

$ ./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

1 个答案:

答案 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。