我正在使用subprocess模块调用不同的进程.然而,我有一个问题.

在以下代码中:

callProcess = subprocess.Popen(['ls', '-l'], shell=True)

callProcess = subprocess.Popen(['ls', '-l']) # without shell

两者都有效.读了这些文档之后,我知道shell=True意味着通过shell执行代码.这意味着在缺席的情况下,这个过程直接开始.

So what should I prefer for my case - I need to run a process 和 get its output. What benefit do I have from calling it from within the shell or outside of it.

推荐答案

不通过shell调用的好处是,您不会调用"神秘程序"在POSIX上,环境变量SHELL控制调用哪个二进制文件作为"shell"在Windows上,没有bourne shell的后代,只有cmd.exe.

因此,调用shell会调用用户 Select 的程序,并且依赖于平台.一般来说,避免通过shell调用.

通过shell调用确实允许您根据shell的通常机制扩展环境变量和文件globs.在POSIX系统上,shell将文件glos扩展为文件列表.在Windows上,文件glob(例如,"*.*")无论如何都不会由shell 展开(但命令行are上的环境变量会由cmd.exe展开).

如果您认为需要扩展环境变量和文件全局,请研究1992年左右对通过shell执行子程序调用的网络服务的ILS次攻击.示例包括涉及ILS个的各种sendmail个后门.

总之,使用shell=False.

Python相关问答推荐

如何让这个星型模式在Python中只使用一个for循环?

pandas:排序多级列

Scrapy和Great Expectations(great_expectations)—不合作

如何更新pandas DataFrame上列标题的de值?

在Python中从嵌套的for循环中获取插值

并行编程:同步进程

如何将泛型类类型与函数返回类型结合使用?

高效生成累积式三角矩阵

操作布尔值的Series时出现索引问题

类型对象';敌人';没有属性';损害';

在一个数据帧中,我如何才能发现每个行号是否出现在一列列表中?

我如何处理超类和子类的情况

.awk文件可以使用子进程执行吗?

如何在Python中画一个只能在对角线内裁剪的圆?

使用Django标签显示信息

以元组为索引的Numpy多维索引

PANDA:如何将多选列转换为索引/列

如何判断特定的OPC UA node 是否已经存在Asyncua?

S最大值除以最小值,然后减1的结果是什么?

捕获脚本和退出代码的多行输出