我想使用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
调用必须处于子进程模式。这个假设是如何完成的?
答案 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]
。