我想使用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:(代码:$fn,) pandoc $fn> ${bname}.html
如果我将最后一行更改为:pandoc $fn > $bname.html,则得到:
$fn: openBinaryFile:不存在(没有这样的文件或目录)
我假设问题是for循环内部是Python,但是pandoc调用必须处于子进程模式。这该怎么做?
发布于 2017-11-21 18:37:35
如果您希望Python变量可以用于子进程(在隐式xonsh意义下),可以将它们包装在@()中。此外,还有一个内置的globber语法,这样您就可以按如下方式编写流程:
import os.path
for fn in g`*.md`:
_, bname = os.path.split(fn)
pandoc @(fn) > @('{}.html'.format(bname))注意,fn和'{}.html'.format()都应该包装在@()中,因为它们是子Note中的python变量(因为您已经调用了命令行函数来启动行)。
另外,您不需要使它们成为环境变量,除非您希望它们可用于其他显式需要envvars集的程序。
希望这能帮上忙!
发布于 2017-11-21 17:25:49
我相信我已经找到了答案,为了在for循环中激活for,您可以使用$[]语法显式地使用未捕获子进程来激活它:
from glob import glob
import os
for $fn in glob('*.md'):
_, $bname = os.path.split($fn)
$[pandoc $fn > $bname.html]为了让python变量传播到子进程中,您似乎需要将它们声明为$varname。
https://stackoverflow.com/questions/47418800
复制相似问题