如何在 xonsh shell 中将 Python 构造的输出传输到另一个命令?

How to pipe In the xonsh shell the output of a Python construct to another command?

xonsh shell 中,如何将 Python 构造的输出通过管道传递给另一个命令?所需示例:

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

在这个 for v in ... 中是 Python 构造,head 是我要通过管道传输其输出的命令。

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

NameError: name 'head' is not defined

看起来 xonsh 没有为管道符号保留 Python 模式(参见 "Pipes" in the xonsh docs)。 - 那么,如何指示 xonsh 将此处的管道字符理解为子进程模式符号?

Xonsh 不支持管道任意 Python 代码到子进程,因为子进程只接受字符串输入。因此 xonsh 只接受 Python 字符串表达式,包含字符串(例如字符串列表)或 return 字符串(例如函数)。 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