2015-06-26 2 views
0

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

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 * 

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

ответ

0

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

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

Другой здесь: Call a shell command containing a 'pipe' from Python and capture STDOUT

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

+0

На самом деле я просто хочу скопировать один файл в несколько папок одновременно с помощью скрипта. – Mon

+0

Ну, было бы проще сделать это на Python? Немного полезных функций: ['os.listdir'] (https://docs.python.org/2/library/os.html#os.listdir), [' os.makedirs'] (https: // docs .python.org/2/library/os.html # os.makedirs), ['shutil.copyfile'] (https://docs.python.org/2/library/shutil.html#shutil.copyfile), [ 'for'] (https://wiki.python.org/moin/ForLoop) – fferri

+0

Большое спасибо, shutil.copy выполнил эту работу. :) – Mon

0

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

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

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

+0

У вас есть альтернативные предложения о копировании одного файла в несколько папок с именем folder1, folder2, folder3 и т. Д.? – Mon