如何在xonsh shell中通过管道将Python构造的输出传递到另一个命令?
在shell中,如何将Python构造的输出通过管道传输到另一个命令?所需示例:如何在xonsh shell中通过管道将Python构造的输出传递到另一个命令?,python,xonsh,Python,Xonsh,在shell中,如何将Python构造的输出通过管道传输到另一个命令?所需示例: for v in ${...}: print ("{}={}".format(v,${v})) | head 在这里,for v In…是Python构造,head是我希望通过管道传递其输出的命令 上面的命令行不工作;我总是遇到以下错误: NameError: name 'head' is not defined 看起来,xonsh没有为管道符号保留Python模式(请参阅)因此,我如何指示xonsh将此处的管
for v in ${...}: print ("{}={}".format(v,${v})) | head
在这里,for v In…
是Python构造,head
是我希望通过管道传递其输出的命令
上面的命令行不工作;我总是遇到以下错误:
NameError: name 'head' is not defined
看起来,
xonsh
没有为管道符号保留Python模式(请参阅)因此,我如何指示xonsh
将此处的管道字符理解为子流程模式符号?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
谢谢你,安东尼。我突然意识到,我需要将Python语句转换为表达式,然后将其转换为子进程,但函数方法对我来说是全新的。Anthony,如果你想将字符串转换为子进程的stdin,有没有比
@(lambda:print(string))|jq…
更简单的方法?很好,但似乎有点尴尬。