当 `shell=True` 时,为什么 `subprocess.Popen` 不能使用列表中的变量参数?

Linda Hamilton
发布: 2024-11-26 05:46:17
原创
130 人浏览过

Why Doesn't `subprocess.Popen` Work with Variable Arguments in Lists When `shell=True`?

将变量传递给 subprocess.Popen:为什么它不能使用列表中的参数

当使用 subprocess.Popen 调用另一个 Python 时脚本时,您可能会遇到传递存储在变量中的参数的问题。当您尝试执行如下命令时,可能会发生这种情况:

p = subprocess.Popen(
    ["python mytool.py -a ", servers[server]['address'], "-x", servers[server]['port'], "-p", servers[server]['pass'], "some additional command"],
    shell=True,
    stdout=subprocess.PIPE
)
登录后复制

问题:

问题的出现是由于使用了 shell=True。启用此标志后,传递给 Popen() 的参数在 Unix 系统上的处理方式有所不同。 shell 将参数解释为单个命令字符串,这可能会导致意外行为。

解决方案:

要解决此问题,放弃使用shell=True。相反,直接创建一个参数列表并将其传递给 Popen()。下面是一个示例:

import sys
from subprocess import Popen, PIPE

# Populate list of arguments
args = ["mytool.py"]
for opt, optname in zip("-a -x -p".split(), "address port pass".split()):
    args.extend([opt, str(servers[server][optname])])
args.extend("some additional command".split())

# Run script
p = Popen([sys.executable or 'python'] + args, stdout=PIPE)
# ... Use p.stdout here
p.stdout.close()
p.wait()
登录后复制

通过删除 shell=True 并手动构建参数列表,可以确保变量正确传递给被调用的脚本。

安全警告:

需要注意的是,为涉及外部输入的命令传递 shell=True 可能会带来安全风险,如子流程文档。如果您在脚本中处理用户提供的输入,强烈建议避免使用 shell=True 以防止潜在的漏洞。

以上是当 `shell=True` 时,为什么 `subprocess.Popen` 不能使用列表中的变量参数?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板