Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.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
python3.7子进程未能为我删除文件_Python_Linux_Shell_Subprocess_Pytest - Fatal编程技术网

python3.7子进程未能为我删除文件

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

我有一个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 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)