如何将Python中的mv命令与子进程一起使用

2024-09-25 16:25:55 发布

您现在位置: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命令时,使用的命令与脚本使用的命令完全相同,它工作得很好。


Tags: 文件no命令home编程错误callstat
3条回答

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

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

注意引号。shell通常在*上为您执行glob匹配,但命令在其命令行上不执行此操作;甚至shell也不执行此操作。有一个名为fnmatch的C库函数为您执行shell样式的全局搜索,每种编程语言或多或少都会复制这个函数。在Python中甚至可能有相同的名称。或者里面有“glob”这个词,我不记得了。

如果这样调用子流程:

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

实际上,您给了/home/somedir/subdir/*命令的参数mv,实际的*文件。i、 你实际上在试图移动*文件。

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

它将使用将展开第一个参数的shell。

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

提示:您还可以使用os.rename()shutil.move()函数,以及os.path.walk()os.listdir()以更python的方式将文件移动到目标位置。

您可以通过添加参数shell=True来解决这个问题,在您的示例中考虑通配符(因此直接编写命令,不带任何列表):

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

如果没有它,参数将直接赋给带星号的mv命令。一般来说,shell的任务是返回与模式匹配的所有文件。

相关问题 更多 >