как вызвать xargs с помощью скрипта

Я новичок в python и все еще на уровне базового обучения. Недавно я попытался написать скрипт для создания новых папок в соответствии с номером, указанным во входном текстовом файле. После создания этих папок я хочу одновременно скопировать файл во все эти папки. Я могу сделать это, набрав

echo equil{1..x} | xargs -n 1 cp *.txt *

в терминале, и он работает нормально. Здесь x — количество папок в моем рабочем каталоге. Но моя забота состоит в том, чтобы сделать это автоматически, т.е. вызывать его из скрипта, чтобы пользователю не нужно было каждый раз вводить эту строку в терминале. Вот почему я попробовал это

sub2 = subprocess.call(['echo', 'equil{1..x}', '|', 'xargs', '-n', '1', 'cp', '*.txt *'])

Может ли кто-нибудь помочь мне и показать мне ошибку. На самом деле я не получаю никакой ошибки, а печатаю это

equil{1..x} | xargs -n 1 cp *.txt *

в терминале после выполнения остальной части скрипта.


person Mon    schedule 26.06.2015    source источник


Ответы (2)


Вы должны использовать subprocess.Popen, если хотите отправлять данные в/из stdin/stdout ваших подпроцессов. И вам нужно Popen подпроцесс для каждого исполняемого файла, т.е. в вашем примере один для echo и один для xargs.

В документации есть пример: https://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline

Другой здесь: Вызовите команду оболочки, содержащую "канал" из Python и захват STDOUT

Однако вместо того, чтобы запускать echo для создания некоторых строк, вы можете напрямую записать их на python в процесс stdin.

person fferri    schedule 26.06.2015
comment
На самом деле я просто хочу скопировать один файл в несколько папок одновременно с помощью скрипта. - person Mon; 26.06.2015
comment
Ну, не проще ли было бы сделать это на Python? Немного полезных функций: os.listdir, os.makedirs, shutil.copyfile, for - person fferri; 26.06.2015

Я не думаю, что вы можете использовать subprocess.call() с каналами. Рецепты использования труб см.

https://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline

т.е. вы бы использовали subprocess.communicate() для двух процессов.

person Leif Hedstrom    schedule 26.06.2015
comment
Есть ли у вас альтернативное предложение скопировать один файл в несколько папок с именами папка1, папка2, папка3 и т. д.? - person Mon; 26.06.2015