• Python中subprocess 模块 创建并运行一个进程


     python的subprocess模块,看到官方声明里说要尽力避免使用shell=True这个参数,于是测试了一下:
     from subprocess import call  import shlex  cmd = "cat test.txt; rm test.txt"  call(cmd, shell=True)

    运行之后:
    1:打开并浏览了test.txt文件
    2:删除了test.txt文件
    from subprocess import call import shlex cmd = "cat test.txt; rm test.txt" cmd = shlex(cmd) call(cmd, shell=False)

    运行之后:
    1:尝试打开名为text.txt;的文件
    2:尝试打开名为rm的文件
    3:打开并浏览了test.txt文件
    shell=True参数会让subprocess.call接受字符串类型的变量作为命令,并调用shell去执行这个字符串,第一个测试中的分号被认为是shell命令中的分隔符,执行了cat和rm两个命令。
    当shell=False是,subprocess.call只接受数组变量作为命令,并将数组的第一个元素作为命令,剩下的全部作为该命令的参数,因此第二个测试只执行了cat命令,并试着打开了作为参数的”text.txt;”,”rm” , “text.txt”三个文件。
    毫无疑问shell=False的参数能让你的程序更加安全,尤其是当你的cmd变量值是从外部读取到的时候。
    假设你有这样的一个需求:让程序运行cat命令,cat的参数则是从一个文件里读取,那代码可能是这样子的
    from subprocess import call param = file.readline() call(cat + param, shell = True)

    一旦当param读取到了”a.txt; rm -rf /;b.txt”之类的字符串时,后果时毁灭性的……
    from subprocess import call import shlex param = file.readline() param = "cat " + param param = shlex(param) call(param, shell = False)

    显然是更好的选择。
  • 相关阅读:
    P1967 货车运输【最大生成树+倍增LCA】!!!
    P1991 无线通讯网【kruskal】
    P2872 [USACO07DEC]Building Roads S【kruskal】
    最小生成树
    树的直径
    树的重心
    今日英语单词小结
    项目生命周期
    反射reflect(框架的基石),动态导入小技巧 | 元类 | 单例设计模式
    OOP的三大特征之多态 | 面向对象高级知识,内置魔法函数,点语法和[ ]取值的实现,运算符重载,迭代器协议,上下文管理
  • 原文地址:https://www.cnblogs.com/ylHe/p/6512404.html
Copyright © 2020-2023  润新知