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

hal*_*leo 6 python xonsh

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

for v in ${...}: print ("{}={}".format(v,${v})) | head
Run Code Online (Sandbox Code Playgroud)

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

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

NameError: name 'head' is not defined
Run Code Online (Sandbox Code Playgroud)

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

Ant*_*atz 5

Xonsh 不支持将任意 Python 代码通过管道传输到子进程,因为子进程仅接受字符串输入。因此,xonsh 只接受字符串、包含字符串(例如 str 列表)或返回字符串(例如函数)的 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
Run Code Online (Sandbox Code Playgroud)