如何在 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 变量(因为您调用了命令线功能开始线)。
此外,您不需要将它们设置为环境变量,除非您希望它们可用于明确需要设置环境变量的其他程序。
希望对您有所帮助!
我想使用 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 变量(因为您调用了命令线功能开始线)。
此外,您不需要将它们设置为环境变量,除非您希望它们可用于明确需要设置环境变量的其他程序。
希望对您有所帮助!