在Jupyter中运行for循环终端命令

16

我知道如何在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: 我尝试了路径,但不起作用:

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个回答

22

无需使用subprocess或format。只需要使用以下简单代码:

不需要子进程或格式化。像这样简单:

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

适用于我。


4
一种可能的hackish解决方案是使用eval,让bash执行一个字符串。
for idx in range(10):
    !eval {"python process.py --filename /Users/images/{image}.jpg".format(image=idx)}

{btsdaf} - Ancalagon BerenLuthien
1
{btsdaf} - Ankur Ankan
刚刚意识到ipython默认情况下不会执行!后面的任何Python字符串。所以,需要将Python部分放在{}之间。希望现在已经修复了。:祈祷: - Ankur Ankan

3
< p > ! 表示以下代码将在终端中执行。

因此,一种选项是在bash中编写语句。虽然不像Python那么简单,但您可以通过以下方式完成相同的任务:

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

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

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


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 从来不是一个好主意 - 命令可能会静默失败。


0
您可以在Colab笔记本中使用bash for循环:
!for file in /Users/images/*.jpg; \
do python process.py --filename $file; \
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接