Как использовать команду 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()
Другие вопросы по тегам