如何在带有子进程的Python中使用mv命令

问题描述 投票:9回答:4

我在/ home / somedir / subdir /中有很多文件,并且我正尝试以编程方式将它们全部移至/ home / somedir。

现在我有这个:

subprocess.call(["mv", "/home/somedir/subdir/*", "somedir/"])

但是它给了我这个错误:

mv: cannot stat `/home/somedir/subdir/*': No such file or directory

我知道它确实存在,因为当我使用与脚本使用的命令完全相同的命令手动键入mv命令时,它可以完美地工作。

python unix subprocess stat mv
4个回答
13
投票

如果您以这种方式调用子流程:

subprocess.call(["mv", "/home/somedir/subdir/*", "somedir/"])

您实际上是将参数/home/somedir/subdir/*赋给mv命令以及一个实际的*文件。也就是说,您实际上是在尝试移动*文件。

subprocess.call("mv /home/somedir/subdir/* somedir/", shell=True)

它将使用将扩展第一个参数的外壳。

Nota Bene:使用shell=True参数时,需要将参数列表更改为将提供给shell的字符串。

提示:您还可以将os.rename()shutil.move()功能与os.path.walk()os.listdir()一起使用,以更加Python化的方式将文件移至目标位置。


2
投票

您可以通过添加参数shell=True来解决此问题,以考虑到您所用的通配符(因此直接编写命令,而没有任何列表):

subprocess.call("mv /home/somedir/subdir/* somedir/", shell=True)

没有它,则将参数直接加星号给mv命令。通常,每个匹配模式的文件都是shell的工作。


2
投票

您正在使用shell globbing *,并期望mv命令知道它的含义。您可以通过以下方式从命令外壳中获得相同的错误:

$ mv 'somedir/subdir/*' ...

请注意引号。 Shell通常会在*上为您执行glob-matching,但是命令不会在其命令行上执行;甚至没有壳。有一个名为fnmatch的C库函数可以为您执行shell样式的globing,每种编程语言都或多或少地复制了该库函数。在Python中甚至可能具有相同的名称。或者它中可能包含“ glob”一词;我不记得了。


0
投票

这是使用子流程Popen的简单方法

导入子过程导入操作系统

类FolderCommands:src =无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(“输入源路径”),input(“输入目标路径”))obj.move()

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.