Как использовать команду 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/*
к mv
команда, с фактическим *
файл. то есть вы на самом деле пытаетесь переместить *
файл.
subprocess.call("mv /home/somedir/subdir/* somedir/", shell=True)
он будет использовать оболочку, которая расширит первый аргумент.
Nota Bene: при использовании shell=True
аргумент, вам нужно изменить список аргументов в строку, которая будет передана оболочке.
Подсказка: вы также можете использовать os.rename()
или же shutil.move()
функции, наряду с os.path.walk()
или же os.listdir()
переместить файлы к месту назначения более питоническим способом.
Вы можете решить это, добавив параметр shell=True
, чтобы учесть подстановочные знаки в вашем случае (и так написать команду напрямую, без какого-либо списка):
subprocess.call("mv /home/somedir/subdir/* somedir/", shell=True)
Без этого аргумент напрямую предоставляется mv
Команда со звездочкой. Задача оболочки - возвращать все файлы, которые в целом соответствуют шаблону.
Вы используете оболочку *
и ожидая mv
Команда, чтобы знать, что это значит. Вы можете получить ту же ошибку из командной оболочки следующим образом:
$ mv 'somedir/subdir/*' ...
Обратите внимание на цитаты. Оболочка обычно выполняет глобальное сопоставление *
для вас, но команды не делают этого в своих командных строках; даже оболочка не делает. Существует функция библиотеки C под названием fnmatch
это делает глобализацию в стиле оболочки, которую каждый язык программирования более или менее копирует. Это может даже иметь то же имя в Python. Или в нем может быть слово "шар"; Я не помню
Вот простой способ работы с подпроцессом Popen
import subprocess
import os
class FolderCommands:
src = None
dst = None
def __init__(self, src, dst):
self.src = src
self.dst = dst
def move(self):
listOfFiles = os.listdir(self.src)
print(listOfFiles)
modify_src = self.src.replace(" ", "\ ")
dst = self.dst.replace(" ", "\ ")
for f in listOfFiles:
#Attaching the filename at the end of the src path
fullPath = modify_src + "/'" + f +"'"
subprocess.Popen("mv" + " " + fullPath + " " + dst, shell=True)
obj = FolderCommands(input("Enter Source path"), input("Enter Destination path"))
obj.move()