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

2024-05-19 01:47:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用xonsh对目录中的所有md文件执行pandoc。我可以使用subprocess,但这在^{中似乎是不必要的。以下是我目前所做的尝试:

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调用必须处于子进程模式。这是怎么做到的?在


Tags: 文件import目录foroshtml模式pandoc
2条回答

我相信我已经找到了答案,似乎为了在for循环中激活subprocess-mode,可以使用$[]语法显式地使用$[]语法来激活subprocess-mode

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

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

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

import os.path

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

请注意,fn和{}都应该包装在@()中,因为它们是子程序中的python变量(因为您调用了命令行函数来启动行)。在

另外,您不需要使它们成为环境变量,除非您希望显式需要设置envvars的其他程序可以使用它们。在

希望有帮助!在

相关问题 更多 >

    热门问题