【问题标题】:How to make python subprocesses run faster如何让python子进程运行得更快
【发布时间】:2021-12-30 23:21:29
【问题描述】:

我正在使用子进程来获取命令的输出,运行命令通常需要大约 2 1/2 分钟,但使用子进程运行时大约需要 35 分钟。

这是有问题的代码:

process = subprocess.Popen(["wpscan --url " + s + " –e u"], stdout=subprocess.PIPE, shell=True)
output = process.communicate()[0]

有没有办法让它跑得更快?我对使用 subprocess 还不是很熟悉,所以我可能需要解释一下。

【问题讨论】:

  • 这是您不应该使用Popen(..., shell=True) 经典示例。使用默认的shell=False不仅更简单,而且安全!
  • 然而,你的 Python 代码根本不涉及你生成的进程所做的事情,所以你无法解决这个问题(除非,实际上我上面的建议导致你的 shell 没有用 @ 做一些意想不到的事情987654324@ 包含例如子字符串 ` & sleep 2000, and &` 和 ; 在 URL 中相当常见,所以我的猜测是,shell=True 是你的敌人)
  • 谢谢!是的,我确保它只有常规字符,所以它肯定是 shell=True。我试试看!
  • 关于@MarcusMüller 提出的问题,您可能希望使用safe_s = urllib.parse.quote_plus(s) 对您的URL 进行编码
  • 那么它们将被 shell 解释。这就是使用 shell (shell=True) 的全部意义所在。如果您只想将值 http://www.cnn.com? & 作为参数传递给可执行文件,您只需使用 shell=FalsePopen(["wpscan", "--url", s, "-e", "u"])

标签: python python-3.x subprocess


【解决方案1】:

subprocess 并没有什么特别之处可以使生成的进程表现得更慢/不同。

行为上的差异几乎可以肯定是由于您的论点被解释的方式。当您以列表形式提供命令时,每个列表项都应该是命令的一部分。您应该利用它而不是尝试通过字符串连接来创建命令组件

例如:

# good
flag_arg = 'Foo' 
subprocess.Popen(['command', '--flag', flag_arg])
#bad
subprocess.Popen(['command --flag' + flag_arg])

shell=True 也是不必要的。你应该需要的是这样的:

Popen(["wpscan", "--url", s, "-e", "u"])

【讨论】:

    猜你喜欢
    • 2021-05-11
    • 2013-03-14
    • 2017-07-10
    • 1970-01-01
    • 2018-02-11
    • 2017-03-19
    • 2018-08-23
    • 2017-07-11
    • 2021-11-03
    相关资源
    最近更新 更多