Расширение *
(подстановка) — это функция вашей оболочки, например, bash. Поэтому вам придется использовать аргумент ключевого слова shell=True
в вызове subprocess.Popen
.
Однако в этом случае я настоятельно рекомендую вместо этого использовать shutil.copytree.
(Во-первых, потому что это намного проще (см. Zen of Python) и менее подвержены ошибкам.Работа с ошибками намного чище, вы получаете приятные исключения, включая список ошибок (для многофайловых операций, таких как ваша), и вам не нужно иметь дело с порождением подпроцесса и общением с ним. Во-вторых, разветвление дочернего процесса, если оно вам не нужно, является ненужной тратой ресурсов. Другие проблемы включают цитирование/экранирование и, возможно, введение уязвимостей в ваш код, если вы не сможете должным образом очистить пользовательский ввод.)
Например:
from shutil import copytree
from shutil import Error
try:
copytree('dir_a', 'dir_b')
except (Error, OSError), e:
print "Attempt to copy failed: %s" % e
Кроме того, вы не должны создавать пути файловой системы путем объединения строк, а вместо этого использовать os.path.join(). Это будет использовать правильный разделитель каталогов (os.sep
) для текущей ОС и позволит вам легко писать переносимый код.
Пример:
>>> import os
>>> os.path.join('/usr/lib', 'python2.7')
'/usr/lib/python2.7'
Примечание. os.path.join
по-прежнему выполняет только (умные) манипуляции со строками - ему все равно, доступен ли этот путь или даже существует.
person
Lukas Graf
schedule
04.09.2012
shutil.copytree()
, чтобы у вас было что-то переносимое, не требующее подпроцессов? - person Wooble   schedule 04.09.2012