【问题标题】:Running for loop terminal commands in Jupyter在 Jupyter 中运行 for 循环终端命令
【发布时间】:2018-04-05 20:12:32
【问题描述】:

我知道如何在 Jupyter 中运行命令行:使用 ! 例如,在 Python process.py 上运行图像文件 2.jpg

! python classify.py --filename /Users/images/2.jpg

问题是,如何在Jupyter单元中以迭代方式(idx)处理文件夹的所有文件,如下所示:

for idx in range(10):
    ! python process.py --filename /Users/images/idx.jpg

谢谢

PS: 我试过 path ,没用:

for i in range(1,10):
    cur_path = '/Users/images/'+str(i)+'.jpg'
    path = os.path.expanduser(cur_path)
    print(i,path)
    ! python process.py --filename path

【问题讨论】:

    标签: python linux shell terminal jupyter-notebook


    【解决方案1】:

    使用glob 模块,也可以使用subprocess 而不是!。一个简单的glob.glob("path/*.jpg") 就可以让你遍历所有图片。

    from glob import glob
    from subprocess import check_call
    
    for i in glob("/Users/images/*.jpg"):
        print("Processing:", i)
        check_call(["python", "process.py", "--filename", i], shell=False)
    

    使用 ! 或 eval 绝不是一个好主意 - 该命令可能会静默失败。

    【讨论】:

      【解决方案2】:

      一个可能的黑客解决方案可能是使用eval 并让 bash 执行一个字符串。

      for idx in range(10):
          !eval {"python process.py --filename /Users/images/{image}.jpg".format(image=idx)}
      

      【讨论】:

      • 感谢您的回复。尝试了您的方法,但得到如下错误: /bin/sh: -c: line 0: syntax error near unexpected token (' /bin/sh: -c: line 0: eval "python process.py --filename /Users/images/{image}.jpg".format (image=idx)'你能分享一些光吗?我可能做错了什么。谢谢
      • @BillAncalagontheblack 我发布的代码中有一个额外的冒号。现已修复。
      • 刚刚意识到ipython默认不执行!之后的任何python字符串。所以,需要把python部分放在{}之间。希望现在修好了。 :手指交叉:
      【解决方案3】:

      ! 只是表示将在终端中执行以下代码。

      因此,一种选择就是在 bash 中编写您的语句。它不像 Python 那样简单,但你可以像这样完成同样的任务:

      ! for file in /Users/images/*.jpg; do python process.py --filename /Users/images/$i; done
      

      这是一个 for 循环,但不是 Python 的 for 循环。

      或者,考虑返回process.py 的源代码并对其进行修改,以便循环遍历目录中的文件。这可以通过os.listdir 函数轻松完成。

      【讨论】:

        【解决方案4】:

        不需要子流程或格式。一些简单的事情:

        for idx in range(10):
            !python process.py --filename /Users/images/{idx}.jpg
        

        为我工作。

        【讨论】:

        • 对我有用
        【解决方案5】:

        您可以在 Colab 笔记本中使用 bash for 循环:

        !for file in /Users/images/*.jpg; \
        do python process.py --filename $file; \
        done
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-06
          • 2011-11-02
          • 1970-01-01
          • 2021-06-17
          • 2020-04-23
          • 2016-10-23
          • 2019-12-22
          相关资源
          最近更新 更多