Как использовать команду mv в Python с подпроцессом
у меня много файлов в /home/somedir/subdir/, и я пытаюсь переместить их все в /home/somedir программно.
сейчас у меня есть это:
subprocess.call(["mv", "/home/somedir/subdir/*", "somedir/"])
но это дает мне эту ошибку:
mv: cannot stat `/home/somedir/subdir/*': No such file or directory
Я знаю, что он существует, потому что, когда я набираю команду MV вручную, используя ту же команду, что и скрипт, он отлично работает.
3 ответов
если вы вызываете подпроцесс таким образом:
subprocess.call(["mv", "/home/somedir/subdir/*", "somedir/"])
ты даешь аргумент /home/somedir/subdir/*
до С . т. е. вы на самом деле пытаетесь переместить .
subprocess.call("mv /home/somedir/subdir/* somedir/", shell=True)
он будет использовать оболочку, которая расширит первый аргумент.
Nota Bene при использовании shell=True
аргумент вам нужно изменить список аргументов в строку, которая будет передана ракушка.
подсказка: вы также можете использовать os.rename()
или shutil.move()
функции, наряду с os.path.walk()
или os.listdir()
переместить файлы в пункт назначения в более подходящие для Python путь.
вы можете решить эту проблему, добавив параметр shell=True
, чтобы учесть подстановочные знаки в вашем случае (и поэтому напишите команду напрямую, без какого-либо списка):
subprocess.call("mv /home/somedir/subdir/* somedir/", shell=True)
без него аргумент непосредственно передается mv
команда со звездочкой. Это задание оболочки для возврата всех файлов, которые соответствуют шаблону в целом.
вы используете оболочку globbing *
, и ожидал mv
команда, чтобы узнать, что это значит. Вы можете получить ту же ошибку из командной оболочки следующим образом:
$ mv 'somedir/subdir/*' ...
обратите внимание на кавычки. Оболочка обычно делает glob-matching on *
для вас, но команды не делают этого в своих командных строках; даже оболочка не делает. Существует функция библиотеки C с именем fnmatch
это делает Shell-style globbing для вас, который каждый язык программирования более или менее копирует. Возможно, у него даже есть такое же имя в Python. Или в нем может быть слово "Глоб", я не помню.