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

时间:2018-10-29 06:12:08

标签: python xonsh

如何在xonsh外壳中将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将此处的管道字符理解为子过程模式符号?

1 个答案:

答案 0 :(得分:1)

Xonsh无法支持将任意的Python代码传递给子流程,因为子流程仅接受字符串输入。因此xonsh只接受Python表达式,这些表达式是字符串,包含字符串(例如str的列表)或返回字符串(例如函数)。 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