如何在 xonsh shell 中将 Python 构造的输出传输到另一个命令?
How to pipe In the xonsh shell the output of a Python construct to another command?
在 xonsh
shell 中,如何将 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
将此处的管道字符理解为子进程模式符号?
Xonsh 不支持管道任意 Python 代码到子进程,因为子进程只接受字符串输入。因此 xonsh 只接受 Python 字符串表达式,包含字符串(例如字符串列表)或 return 字符串(例如函数)。 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
在 xonsh
shell 中,如何将 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
将此处的管道字符理解为子进程模式符号?
Xonsh 不支持管道任意 Python 代码到子进程,因为子进程只接受字符串输入。因此 xonsh 只接受 Python 字符串表达式,包含字符串(例如字符串列表)或 return 字符串(例如函数)。 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