首页 > 解决方案 > 如何在python脚本中使用名称(“Web内容”)中的空格来杀死进程

问题描述

美好的一天,这应该是相当直截了当的,但我的谷歌搜索和实验不起作用。

我在 python 中有一个抓取脚本,它使用在 Ubuntu 18 服务器上运行的 Selenium/geckodriver/Firefox。有时它不能正确关闭,Selenium 会在中脚本崩溃,但它会使许多Web Content进程处于打开状态。如果没有关闭,它们会耗尽所有内存,然后 selenium 将无法再打开并且脚本失败。

如果我从命令行运行:pkill 'Web Content'它将杀死这些进程并释放内存。

在我的 python 脚本中,我使用该subprocess模块尝试在 Selenium 崩溃时自动执行此操作。我尝试了多种选择,包括:

所有这些都会引发相同的错误:pkill: only one pattern can be provided

但是,如果我执行类似subprocess.call("pkill firefox".split())代码的操作,则可以正常运行。

我必须怎么做才能解决这个问题?谢谢你。

标签: pythonubuntusubprocess

解决方案


您有 2 个选项:

使用subprocess.call("pkill 'Web Content'", shell=True)

subprocess.call(shlex.split("pkill 'Web Content'"))

选项1

文档

在 shell=True 的 POSIX 上,shell 默认为 /bin/sh。如果 args 是字符串,则该字符串指定要通过 shell 执行的命令。这意味着字符串的格式必须与在 shell 提示符下键入时的格式完全相同。

split()在空格周围分割 Python 字符串:

>>> "pkill 'Web Content'".split()
['pkill', "'Web", "Content'"]

所以subprocess.call("pkill 'Web Content'".split())pkill:提供了两个参数"'Web""Content'"而它只需要一个。这就是错误pkill: only one pattern can be provided弹出的原因。

请注意等效于的subprocess.call 签名subprocess.Popen

subprocess.Popen(args,..

文档

args 应该是一系列程序参数,或者是单个字符串或类似路径的对象。默认情况下,如果 args 是一个序列,则要执行的程序是 args 中的第一项。

使用时还要注意安全注意事项shell=True

选项 2

如果要提供 args 序列,请使用shlex.split

>>> s = "pkill 'Web Content'"
>>> import shlex
>>> args = shlex.split(s)
>>> import subprocess
>>> subprocess.call(args)

shlex.split将使用类似 shell 的语法拆分字符串。s

由您决定使用哪个选项,请注意此答案中的相关信息:

了解 shell=True 与 shell=False 使用 shell=True 您将单个字符串传递给您的 shell,然后 shell 从那里获取它。

使用 shell=False,您可以绕过 shell 将参数列表传递给操作系统。

当您没有外壳时,您可以保存一个进程并消除相当多的隐藏复杂性,这些复杂性可能存在也可能不存在错误甚至安全问题。

另一方面,当您没有 shell 时,您就没有重定向、通配符扩展、作业控制和大量其他 shell 功能。


推荐阅读