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