如何在 xonsh 的 for 循环中 运行 shell 命令?

How to run a shell command in a for loop in xonsh?

我想使用 xonsh 对目录中的所有 md 文件执行 pandoc。我 可以 使用 subprocess,但这在 xonsh 中似乎是不必要的。到目前为止,这是我尝试过的:

from glob import glob
import os
for fn in glob('*.md'):
    bname, _ = os.path.splitext(fn)
    pandoc $fn > ${bname}.html

有了这个我得到了 SyntaxError:

SyntaxError: :3:11: ('code: $fn',) pandoc $fn > ${bname}.html

如果我将最后一行更改为:pandoc $fn > $bname.html,我得到:

pandoc: $fn: openBinaryFile: does not exist (No such file or directory)

我认为问题是 for 循环内部是 Python 模式,但 pandoc 调用必须处于子进程模式。 应该如何完成?

我相信我已经找到了答案,似乎为了在 for 循环中激活 subprocess-mode,您可以使用 uncaptured subprocess 使用 $[]语法:

from glob import glob
import os
for $fn in glob('*.md'):
    _, $bname = os.path.split($fn)
    $[pandoc $fn > $bname.html]

为了让 python 变量传播到子流程中,您似乎需要将它们声明为 $varname

如果您希望 Python 变量可用于子进程(在隐式 xonsh 意义上),您可以将它们包装在 @() 中。 此外,还有一个内置的 globber 语法,因此您可以按如下方式编写过程:

import os.path

for fn in g`*.md`:
    _, bname = os.path.split(fn)
    pandoc @(fn) > @('{}.html'.format(bname))

请注意,fn'{}.html'.format() 都应包含在 @() 中,因为它们是子过程中的 python 变量(因为您调用了命令线功能开始线)。

此外,您不需要将它们设置为环境变量,除非您希望它们可用于明确需要设置环境变量的其他程序。

希望对您有所帮助!