Una possibile soluzione hacker potrebbe essere quella di utilizzare eval e lascia che bash esegua una stringa. 
for idx in range(10):
    !eval {"python process.py --filename /Users/images/{image}.jpg".format(image=idx)}
 Usa il glob module e forse subprocess invece di ! . Un semplice glob.glob("path/*.jpg") ti permetterà di iterare su tutte le immagini.
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)
 Usando ! o eval non è mai una buona idea - il comando potrebbe fallire silenziosamente.
 Il ! indica semplicemente che il seguente codice verrà eseguito nel terminale.
Quindi un'opzione è solo quella di codificare la tua dichiarazione in bash. Non è così facile come Python, ma puoi eseguire lo stesso compito in questo modo:
! for file in /Users/images/*.jpg; do python process.py --filename /Users/images/$i; done
È un ciclo for, ma non un ciclo for di Python.
 In alternativa, considera di tornare al codice sorgente di process.py e modificandolo in modo che scorra i file in una directory. Questo può essere fatto abbastanza facilmente con il os.listdir funzione.
Non c'è bisogno di sottoprocessi o formati. Qualcosa di semplice come:
for idx in range(10):
    !python process.py --filename /Users/images/{idx}.jpg
funziona per me.