首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在xonsh中的for循环中运行shell命令?

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

Stack Overflow用户
提问于 2017-11-21 17:09:15
回答 2查看 672关注 0票数 1

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

代码语言:javascript
复制
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调用必须处于子进程模式。这该怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-21 18:37:35

如果您希望Python变量可以用于子进程(在隐式xonsh意义下),可以将它们包装在@()中。此外,还有一个内置的globber语法,这样您就可以按如下方式编写流程:

代码语言:javascript
复制
import os.path

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

注意,fn'{}.html'.format()都应该包装在@()中,因为它们是子Note中的python变量(因为您已经调用了命令行函数来启动行)。

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

希望这能帮上忙!

票数 6
EN

Stack Overflow用户

发布于 2017-11-21 17:25:49

我相信我已经找到了答案,为了在for循环中激活for,您可以使用$[]语法显式地使用未捕获子进程来激活它:

代码语言:javascript
复制
from glob import glob
import os
for $fn in glob('*.md'):
    _, $bname = os.path.split($fn)
    $[pandoc $fn > $bname.html]

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47418800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档