【问题标题】:python remove command subprocess.call with regexpython 使用正则表达式删除命令 subprocess.call
【发布时间】:2020-11-20 13:49:59
【问题描述】:

我正在尝试在 linux 中从 python 执行 rm 命令,如下所示

remove_command = [find_executable(
            "rm"), "-rf", "dist/", "python_skelton.egg-info", "build/", "other/*_generated.py"]
print('Removing build, dist, python_skelton.egg-
if subprocess.call(remove_command) != 0:
  sys.exit(-1)

目录已成功删除,但正则表达式模式 other/*_generated.py 不会删除相关的 _generated.py 文件。

如何使用正则表达式从 python 脚本中删除这些文件?

【问题讨论】:

    标签: python python-3.x linux subprocess


    【解决方案1】:

    这不能按您预期的方式工作的原因是您的模式没有扩展,而是被解释为乱码文件名"other/*_generated.py"。发生这种情况是因为您依赖于所谓的glob pattern expansion

    glob 模式通常由 shell 扩展,但由于您在不使用 shell 的情况下调用 rm 命令,因此您不会“自动”完成此操作。我可以看到两种明显的方法来处理这个问题。

    在调用subprocess之前扩展全局对象

    这可以做到,使用 Python 标准库 glob 实现:

    import glob
    
    remove_command = [find_executable("rm"), "-rf", "dist/", "python_skelton.egg-info", 
                      "build/"] + glob.glob("other/*_generated.py")
    subprocess.call(remove_command)
    

    使用 shell 扩展 glob

    为此,您需要将shell=True 传递给subprocess.call。而且,与往常一样,在使用 shell 时,我们应该将命令作为单个字符串而不是列表传递:

    remove_command = [find_executable("rm"), "-rf", "dist/", "python_skelton.egg-info", 
                      "build/", "other/*_generated.py"]
    remove_command_string = " ".join(remove_command) # generate a string from list
    subprocess.call(remove_command_string, shell=True)
    

    这两种方法都可以。请注意,如果您允许用户输入,则应避免使用shell=True,因为它是一个安全漏洞,可用于执行任意命令。但是,在当前的用例中,情况似乎并非如此。

    【讨论】:

      猜你喜欢
      • 2019-02-16
      • 2020-09-03
      • 1970-01-01
      • 2018-06-22
      • 2012-02-22
      • 2011-12-23
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多