我正在使用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会调用用户选择的程序,并且依赖于平台.一般来说,避免通过shell调用.

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

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

总之,使用shell=False.

Python相关问答推荐

是否有用于表示数据增量的标准算法或库?

计算区间中素数的算法不起作用

如何使用现代 Python 重定向模块导入?

在 O(N) 中找到列表中元素总和一半的最小步骤数,其中每个步骤将列表中的项目减半

如何加快 aiohttp 解析器 bs4?

Pandas :列的值,然后按相同的 ID 分组和合并

使用 psycopg3 跨服务器复制表

在python中用浮点表示搜索和替换特定字符串

如何在 Python 中替换字符串中的数字?

Python:如何将列表中以某个字母开头的元素复制到新列表中或从列表中删除不以字母开头的元素

Python:为什么 pip install 不从 sdist 部署我的代码?

Python:元组和单个浮点数的高效展开/展平列表

将负数四舍五入到最接近零的 1,000

根据组内的条件过滤 Pandas Groupby 中的行

将 DataFrame 中的嵌入字典列表展开为 DataFrame 的新列

具有单一分类特征的 LSTM 预测

从 python `dataclass` `__repr__` 中排除默认字段

如何通过使用 Python OpenCV 去除噪音来检测复选框?

Pandas 根据 Excel 中的条件更改字体 colored颜色 并保存到相同的 excel python

我想替换字母/单词,但我在代码的一个方面面临挑战