python3.7子进程未能为我删除文件
我有一个python脚本,它使用运行linux命令的“subprocess”来确认我的任务正在做正确的事情,并且运行良好。但我发现,在运行我的任务时,它同时会生成一些日志文件。因此,我在开始时为rm日志文件添加了一个清理功能。我的剧本是:python3.7子进程未能为我删除文件,python,linux,shell,subprocess,pytest,Python,Linux,Shell,Subprocess,Pytest,我有一个python脚本,它使用运行linux命令的“subprocess”来确认我的任务正在做正确的事情,并且运行良好。但我发现,在运行我的任务时,它同时会生成一些日志文件。因此,我在开始时为rm日志文件添加了一个清理功能。我的剧本是: def test_clean_up_logs(path_to_my_log): regex = path_to_my_log + ".*" # i need this because log will append current date tim
def test_clean_up_logs(path_to_my_log):
regex = path_to_my_log + ".*" # i need this because log will append current date time when it's generated
print(regex) # i can see it's correct
result = subprocess.run(['rm', '-rf', regex])
def test_my_real_test():
# This will run my real test and generate log files
但事实证明,在我添加第一个测试之后,它并没有为我删除日志文件,它在我的构建目录中仍然有越来越多的日志文件。我使用以下方式运行它:
Python3.7 -m pytest /path/to/mydir
我的问题是:
1.为什么它不起作用?在我的第二个测试用例中,我使用“subprocess”运行一个linux命令,它运行得很好。2.这是清理日志文件的正确方法吗?我想不出更好的方法来自动完成它。谢谢 为什么它不起作用 因为您给命令的参数是以引号传递的,而像
*
这样的通配符在引号中不起作用。当前执行的命令如下所示:
在终端中尝试此操作,您将看到它不会删除以文件名开头的文件。
您需要传递shell=True
以在shell解释器中执行命令,并将命令作为单个字符串给出
subprocess.run(f'rm -rf {regex}', shell=True)
也许?@code3:首先,
rm
命令需要文件名,并且不接受任何模式(参见man-rm)。第二,您可以使用模式,但您必须让模式通过shell扩展到文件列表中(即,您必须运行诸如['/bin/sh','-c',rm YOURPATTERN']
),但即使如此,模式也不能是正则表达式,正如您命名变量regex所建议的那样,但一定是全球模式。谢谢。但是为什么我的第二次考试通过了呢?它类似于subprocess.run(['aaa.tsk','-input',FileA',-output',FileB]),并且运行良好。我应该也使用“shell=True”吗?对不起,我不知道如何在我的评论中设置代码格式,并尝试使用“enter+shift”,所以只是不正确地发布了它,因为那里没有任何通配符。它们只是普通字符串,所以即使引用它们,它们也能正常工作。不,您不应该传递shell=True
。我能理解它吗?只有当我需要shell扩展时,我才应该使用“shell=True”,或者即使它是linux命令,我也不应该使用它?是的,如果参数中有特殊符号(如*
,~
等),您需要传递shell=True
。如果没有,那就看你了。但是如果你通过了,你需要像我一样以“单字符串”
的形式给出你的命令。
subprocess.run(f'rm -rf {regex}', shell=True)