【问题标题】:How to pipe output of a python script which reads arguments to other shell scripts?如何将读取参数的python脚本的输出传递给其他shell脚本?
【发布时间】:2013-10-03 19:51:27
【问题描述】:
$ ./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

【问题讨论】:

  • 请发布您看到的确切错误。
  • Python 永远不会看到 shell 语法,shell 对程序透明地处理它。你遇到了什么错误?
  • 我们无法通过猜测来修正近似值,我们需要 exact 错误消息。脚本本身对我来说似乎很好。
  • 你还没说“失败”是什么意思。上述工作,除了你没有在回声中使用“$x”。
  • ,复制您在控制台中看到的错误并将其粘贴到此处。 “失败”究竟是什么意思?我们需要在您的控制台中打印的错误消息(如果有)。

标签: python shell


【解决方案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 是一个悬而未决的问题。

【讨论】:

    猜你喜欢
    • 2018-12-14
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    相关资源
    最近更新 更多