Почему subprocess.call игнорирует звездочку "*", передающую команду 'mv'

У меня возникают проблемы при попытке переместить каталог tmp в путь назначения

tmp = tempfile.mkdtemp()

создание каталога tmp

генерирует несколько подкаталогов и файлов внутри каталога tmp

subprocess.call(['mv',tmp+'/*','destinationDir'])  

перемещение сгенерированных подкаталогов в папку назначения.

но subprocess.call он перемещает каталог tmp в пункт назначения, вместо этого я хочу переместить только все подкаталоги tmp not 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)