Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python subprocess.call管理目录下的所有文件_Python_Python 3.x_Subprocess_Python 3.4_Rm - Fatal编程技术网

使用python subprocess.call管理目录下的所有文件

使用python subprocess.call管理目录下的所有文件,python,python-3.x,subprocess,python-3.4,rm,Python,Python 3.x,Subprocess,Python 3.4,Rm,我正在编写一个脚本,将文件移动到用户主文件夹中的.trash目录中。我想通过使用python的subprocess.call()调用rm-rf/home/user/.trash/*来添加清空垃圾箱目录的功能 正如您所看到的,rm命令没有删除垃圾箱中的内容。但是,如果我直接在命令行上执行该命令,它就会工作 ~$ rm -rf /home/rodney/.trash/* ~$ ls .trash ~$ 输出来自以下代码 print(cmd) subprocess.call(cmd) 奇怪的是,

我正在编写一个脚本,将文件移动到用户主文件夹中的.trash目录中。我想通过使用python的subprocess.call()调用
rm-rf/home/user/.trash/*
来添加清空垃圾箱目录的功能

正如您所看到的,rm命令没有删除垃圾箱中的内容。但是,如果我直接在命令行上执行该命令,它就会工作

~$ rm -rf /home/rodney/.trash/*
~$ ls .trash
~$ 
输出来自以下代码

print(cmd)
subprocess.call(cmd)
奇怪的是,如果我将*从cmd列表的最后一个参数中排除,那么子进程调用可以工作,但也会删除整个.trash目录。我不想删除.trash目录;只有它下面的一切

总而言之

这很有效

import subprocess
subprocess.call(['rm', '-rf', '/home/rodney/.trash/'])
这是不可能的

import subprocess
subprocess.call(['rm', '-rf', '/home/rodney/.trash/*'])

为什么?

Shell将
*
扩展为文件名。您需要传递
shell=True
关键字参数,以便shell解释
*

import subprocess
subprocess.call('rm -rf /home/rodney/.trash/*', shell=True)

根据:

如果
shell
为True,则指定的命令将通过 壳如果您主要是将Python用于 它在大多数系统外壳上提供了增强的控制流,并且仍然需要 方便访问其他外壳功能,如外壳管道, 文件名通配符、环境变量扩展和~ 到用户的主目录。但是,请注意Python本身提供了 许多shell类功能的实现(特别是glob、, fnmatch、os.walk()、os.path.expandvars()、os.path.expanduser()和 舒蒂尔)

别发牢骚

这用于标识要删除的文件,并删除子目录

#!/usr/bin/env python
import os, os.path
import glob
import shutil

def remove_thing(path):
    if os.path.isdir(path):
        shutil.rmtree(path)
    else:
        os.remove(path)

def empty_directory(path):
    for i in glob.glob(os.path.join(path, '*')):
        remove_thing(i)

empty_directory('trash')
示例:

$tree垃圾/
垃圾/
├── aaa
├── bbb
├── ccc
├── ddd
└── 附属的
├── 三,
└── jjj
1个目录,6个文件
美元/市盈率
$tree垃圾/
垃圾/
0个目录,0个文件

你为什么要到
rm
去做一些简单的事情,比如在python中删除文件?我认为编写会比创建文件列表和遍历所有子目录更快。也许,但从长远来看,学习python提供的API会让你受益更多。看见否则,您也可以将其作为Bash脚本编写。请注意,
*
与以点开头的文件不匹配。只需尝试此操作,现在如果使用列表,我会得到“rm:missing operand”。加入列表成功地解决了这一问题。谢谢。@Rodneyxr,我相应地修改了代码。感谢您的反馈。请使用
os.path.join(路径“*”)
而不是
path+“/*”
。虽然
os.listdir(path)
可能比
glob
更好地表达OP的意图(包括
*
条目)。我不知道这么简单。我执行了你的建议。我不知道
*
与隐藏文件不匹配,所以我也加入了@J.F.Sebastian的建议。对于空的_目录,我在os.listdir(path)中为f添加了
[remove(os.path.join(path,f)]
,现在一切都正常了。请不要使用列表理解“仅仅因为”--的正常
循环在这里是Pythonic的。您无缘无故地为每次调用
remove
创建一个
列表
,其中包含
None
。虽然向
rm
求教或使用列表理解都不会对代码的性能造成不利影响,但在学习过程中考虑编写代码的后果是一个非常好的主意。
#!/usr/bin/env python
import os, os.path
import glob
import shutil

def remove_thing(path):
    if os.path.isdir(path):
        shutil.rmtree(path)
    else:
        os.remove(path)

def empty_directory(path):
    for i in glob.glob(os.path.join(path, '*')):
        remove_thing(i)

empty_directory('trash')