Почему subprocess.call игнорирует звездочку "*", передающую команду 'mv'
У меня проблемы при попытке двигаться tmp
каталог к пути назначения
tmp = tempfile.mkdtemp()
создание каталога tmp
создание нескольких подкаталогов и файлов внутри tmp
каталог
subprocess.call(['mv',tmp+'/*','destinationDir'])
перемещение созданных подкаталогов в папку назначения.
но subprocess.call
это движется tmp
вместо этого я хочу переместить только все подкаталоги tmp
не tmp
сам.
Я попробовал команду в терминале, она работает нормально и перемещает только все подкаталоги... тогда в чем проблема subprocess.call
!!!??
1 ответ
Решение
subprocess.call
не вызывает оболочку по умолчанию. *
расширяется оболочкой:
import pipes
from subprocess import check_call
check_call("mv %s/* %s" % tuple(map(pipes.quote, [tmp, destination_dir])),
shell=True)
Или без оболочки, используя glob
модуль:
import os
from glob import glob
from subprocess import check_call
check_call(['mv'] + glob(os.path.join(tmp, '*')) + [destination_dir])
Или без использования внешнего подпроцесса shutil.move
:
import os
import shutil
for path in os.listdir(tmp):
shutil.move(os.path.join(tmp, path), destination_dir)