Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在xonsh shell中通过管道将Python构造的输出传递到另一个命令?_Python_Xonsh - Fatal编程技术网

如何在xonsh 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将此处的管

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

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…
更简单的方法?很好,但似乎有点尴尬。