在Jupyter中运行循环终端命令

时间:2017-10-24 21:43:12

标签: python linux shell terminal jupyter-notebook

我知道如何在Jupyter中运行命令行:使用! 例如,在Python 2.jpg

上运行图像文件process.py
! python classify.py --filename /Users/images/2.jpg

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

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

由于

PS: 我尝试了路径,但没有工作:

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

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

不需要子进程或格式。简单的事情:

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

适合我。

答案 2 :(得分:0)

使用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绝不是一个好主意 - 命令可能会无声地失败。

答案 3 :(得分:0)

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

所以一个选项只是用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 :(得分:0)

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

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