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

4

1 回答 1

1

问题是您的文档包含无法打印到 ascii 输出流的非 ascii 字符。

在内部,python 可以处理任何 unicode 字符,但是当该字符被序列化时,python 需要知道要使用哪种表示形式(utf-8、utf-16 或任何一种国际字符编码),以便它可以写入正确的位。

在控制台中运行时,python 可以获得终端的编码(我的恰好是 en_US.UTF-8)并为 sys.stdout 正确设置编码器。当将 stdout 传送到另一个程序或将 stdout 重定向到文件时,python 不知道该做什么,并且默认为 sys.stdout 设置 ascii 编码器。

在控制台中运行时,编码器通常知道如何将字符转换为终端的正确位,并且您会得到一个很好的显示。管道传输时,ascii 编码器无法处理字符并引发错误。

一种解决方案是在写入标准输出之前将所有内容编码为 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 是一个悬而未决的问题。

于 2013-10-03T21:00:15.813 回答