В ответ на один из ответов, приведенных здесь, я покажу, как это сделать с subprocess.check_call()
.
Если вы хотите использовать перенаправление оболочки в subprocess
, у вас должна быть оболочка:
for i in range(5):
subprocess.check_call('echo "$RANDOM" >random-{}.txt'.format(i), shell=True)
Вы можете поверхностно попытаться избавиться от shell=True
... но тогда echo
и $RANDOM
также являются функциями оболочки.
Решение на основе чистого Bashбудет
!for i in {0..4}; do printf "%s\n" "$RANDOM" >random-"$i".txt; done
(Кроме того, числовой контекст в $((RANDOM))
не является неправильным, но совершенно лишним.)
Вы можете интерполировать выражение Python в команду !
строка с {...}
.Следующее также работает, например:
!{';'.join(['echo $RANDOM >random-{}.txt'.format(i) for i in range(5)])}
В iPython я могу получить ожидаемые результаты с помощью использованной вами конструкции:
in [15]: for i in range(2):
...: c='echo $RANDOM >random-{}.txt'.format(i)
...: !{c}
...:
in [16]: !tail random-*.txt
==> random-0.txt <==
15637
==> random-1.txt <==
32475
Если Jupyter использует ядро iPython, яЯ думаю, это должно сработать и для вас.
Обратите внимание, как я использовал простое старое перенаправление >
вместо &>
- там действительно действительно действительно нет никакой разумной причины хотеть, чтобы сообщения об ошибках были перенаправлены к файлам;и если файл не может быть создан, вы абсолютно не представляете, что не удалось и почему, или даже , что не удалось.(Я подозреваю, что это действительно причина ваших проблем, на самом деле. В доступе отказано? Диск заполнен? Мы не можем знать.)
Хотя я бы предложил вам использовать Python для выполнения этой простой задачи.Запуск подпроцесса для выполнения чего-то относительно простого в самом Python неэффективен и неуклюж, а также несколько хрупок.