Почему 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)
Другие вопросы по тегам