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

时间:2017-11-21 17:09:16

标签: python shell xonsh

我想使用xonsh对目录中的所有pandoc文件执行md。我可以使用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 :('代码:$ fn',)       pandoc $ fn> $ {BNAME} html的

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

  

pandoc:$ fn:openBinaryFile:不存在(没有这样的文件或目录)

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

2 个答案:

答案 0 :(得分:3)

如果希望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变量(因为您调用了命令行函数来启动该行)。

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

希望有所帮助!

答案 1 :(得分:0)

我相信我已经找到了答案,似乎为了在subprocess-mode循环中激活for,您可以使用{{1} uncaptured subprocess明确地执行此操作语法:

$[]

为了让python变量传播到子进程中,似乎需要将它们声明为from glob import glob import os for $fn in glob('*.md'): _, $bname = os.path.split($fn) $[pandoc $fn > $bname.html]