首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用xonsh的列表理解

使用xonsh的列表理解
EN

Stack Overflow用户
提问于 2018-05-18 15:23:08
回答 3查看 175关注 0票数 3

我对此仍不熟悉,但是否可以使用列表理解语法在xonsh中执行多个命令?

我希望下面的内容可以创建5个文件( file00 to file04 ),但它却出错了:

代码语言:javascript
复制
$ [@(['touch', 'file%02d' % i]) for i in range(5)]
............................ 
xonsh: For full traceback set: $XONSH_SHOW_TRACEBACK = True
  File "<string>", line None
SyntaxError: <xonsh-code>:1:1: ('code: @(',)
[@(['touch', 'file%02d' % i]) for i in range(5)]
 ^

我认为这是可行的,因为下面的工作很好:

代码语言:javascript
复制
$ [i for i in range(5)]
[0, 1, 2, 3, 4]

$ @(['touch', 'file%02d' % 3])
$ ls
file03
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-19 14:18:34

最接近原始代码的方法是使用子进程:

[$[touch @('file%02d' % i)] for i in range(5)]

解释嵌套$[ .. @(的必要性

  • 顶层命令是一个列表理解,所以我们从Python模式开始;
  • 我们希望执行bash命令(touch),因此我们需要使用$[ (或捕获输出的$( )进入子进程模式;
  • 但是该命令的参数需要用Python进行字符串内插,因此Python模式也需要使用@(
票数 2
EN

Stack Overflow用户

发布于 2018-05-18 16:50:02

看起来你找到了一种方法来做这件事--有时候特定子进程命令的行为会影响你把它放在一起的方式。

touch的例子中,由于它可以使用多个参数,所以在列表理解中(我可以想到)最简单的方法是这样做。

touch @([f'file_{i}' for i in range(5)])

票数 2
EN

Stack Overflow用户

发布于 2018-05-18 15:38:38

我已经快到了,有必要进一步包装命令:

代码语言:javascript
复制
$ [ $(@(['touch', 'file%02d' % i])) for i in range(5)]

其原因如下:

  • 考虑到顶层命令是一个列表理解,我们将进入Python模式。
  • 我们希望执行bash命令(touch),因此我们需要使用$(进入子进程模式。
  • 但是,该命令的参数需要使用Python进行字符串内插,因此编写命令本身需要Python-模式,因此需要@(
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50414586

复制
相关文章

相似问题

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