Передача списка вызову подпроцесса

У меня проблема с попыткой передать список в команду вызова подпроцесса. Я пытаюсь вызвать функцию Windows robocopy, передавая список типов файлов, по которым она должна фильтроваться.

filter_list = ['*.txt', '*.dat']
call(["robocopy", src, dst, filter_list, "/e"])

Таким образом, передача самого списка не работает. Выходные данные robocopy показали, что он пытался найти тип файла «.txt.dat», как если бы весь список был файлом одного типа.

Затем я попробовал следующее

call(["robocopy", src, dst, ','.join(filter_list), "/e"])

Однако это дало тот же результат, что и моя первая попытка. Кто-нибудь знает, как передать список и правильно разделить его? Любая помощь очень ценится!


person Lord_Migit    schedule 06.05.2015    source источник
comment
Можешь попробовать call(["robocopy", src, dst, " ".join(filter_list), "/e"]) ?   -  person Stian OK    schedule 06.05.2015
comment
@StianOK все тот же результат. Теперь Robocopy использует фильтр файлов *.txt *.dat.   -  person Lord_Migit    schedule 06.05.2015


Ответы (1)


Фактически вы должны передать аргументы в списке:

args = ["robocopy", src, dst]
args.extend(filter_list)
args.append("/e")
call(args)
person Thomas Orozco    schedule 06.05.2015
comment
Ах, добавление и расширение были вещами, о которых я не знал. Большое спасибо, кажется, это сработало! :) - person Lord_Migit; 06.05.2015
comment
Имя robocopy предполагает, что OP использует Windows, где список преобразуется в строку для CreateProcess, т. е. он не передается напрямую как argv. - person jfs; 09.05.2015
comment
@J.F.Sebastian — Это хороший момент. Я удалил часть о argv. Но даже в Windows Python гарантирует, что аргументы правильно указаны в кавычках, верно? - person Thomas Orozco; 10.05.2015
comment
@ThomasOrozco: правильное цитирование может определяться каждой отдельной программой в Windows. Python использует правила цитирования, используемые некоторыми программами C в Windows. Следуйте ссылкам в этом вопросе SO - person jfs; 10.05.2015