首页 > 后端开发 > Python教程 > 为什么 subprocess.Popen 在将变量作为参数传递时失败,如何修复?

为什么 subprocess.Popen 在将变量作为参数传递时失败,如何修复?

Linda Hamilton
发布: 2024-12-04 04:32:10
原创
540 人浏览过

Why Does subprocess.Popen Fail When Passing Variables as Arguments, and How Can I Fix It?

对 Subprocess.Popen 参数传递差异进行故障排除

尝试将变量传递给 subprocess.Popen() 以执行脚本时,用户可能会遇到困难如果参数存储在变量中。为了解决这个问题,让我们深入研究问题并提供解决方案。

问题:

最初的方法涉及直接从变量传递参数,如下所示:

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。当设置为 True 时,Popen() 的参数在 Unix 系统上的处理方式不同,导致解析错误。通过删除 shell=True,我们可以直接将参数作为列表传递:

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...
登录后复制

绕过shell 消除了之前的解析问题并允许正确执行命令。

安全性注意事项:

需要注意的是,由于潜在的安全隐患,在处理外部输入时不鼓励设置 shell=True。因此,建议避免使用 shell=True ,而是采用上面概述的方法将参数传递给 Popen()。

以上是为什么 subprocess.Popen 在将变量作为参数传递时失败,如何修复?的详细内容。更多信息请关注PHP中文网其他相关文章!

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