4

xonshshell 中,如何将 Python 构造的输出通过管道传输到另一个命令?期望的例子:

for v in ${...}: print ("{}={}".format(v,${v})) | head

for v in ...是 Python 构造,head也是我想要通过管道输出其输出的命令。

上面的命令行不起作用;我总是收到以下错误:

NameError: name 'head' is not defined

看起来xonsh没有为管道符号留下 Python 模式(请参阅xonsh 文档中的“管道”)。- 那么,我该如何指导xonsh将这里的管道字符理解为子进程模式符号?

4

1 回答 1

4

Xonsh 不支持将任意 Python 代码通过管道传输到子进程,因为子进程只接受字符串输入。因此 xonsh 只接受作为字符串、包含字符串(例如 strs 列表)或返回字符串(例如函数)的 Python 表达式。xonsh 只接受子进程的表达式的原因是子进程本身是作为表达式实现的。

上面示例代码的问题在于,您正试图将一条语句(特别是 for 语句)通过管道传输到子进程(它是一个表达式)中。这在纯 Python 中在语法上无效,并且在 xonsh 中也没有,因为不清楚应该将|表达式|应用于后面的哪些语句。

要解决上述问题,您需要将 for 循环更改为表达式。以下是几个示例:

# use a list comprehension
echo @(["{}={}\n".format(v,${v}) for v in ${...}]) | head

# use a function
def f(): 
    for v in ${...}: 
        print("{}={}".format(v,${v}))

@(f) | head
于 2018-10-29T15:20:36.467 回答