1

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

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:不存在(没有这样的文件或目录)

我认为问题在于for循环内部是 Python 模式,但pandoc调用必须处于子进程模式。这应该怎么做?

4

2 回答 2

6

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

import os.path

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

请注意, thefn和 the'{}.html'.format()都应该包含在其中,@()因为它们是子进程中的 python 变量(因为您已经调用了命令行函数来启动该行)。

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

希望有帮助!

于 2017-11-21T18:37:35.987 回答
0

我相信我已经找到了答案,似乎为了subprocess-modefor循环中激活,您可以使用以下语法使用未捕获的子进程显式执行此操作:$[]

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

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

于 2017-11-21T17:25:49.133 回答