Почему 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)