如何在 python 脚本中使用名称(“Web 内容”)中的空格来 pkill 进程

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

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

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

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

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

  • subprocess.call("pkill 'Web\ Content'".split())

  • subprocess.call("pkill Web\ Content".split())

  • subprocess.call("pkill -f Web\ Content".split())

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

然而,如果我做了类似的事情,subprocess.call("pkill firefox".split())代码就能够运行而不会出现错误。

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


茅侃侃
浏览 150回答 2
2回答

拉莫斯之舞

自己手动拆分命令行可以显着简化整个问题。subprocess.run(['pkill', 'Web Content'], check=True)如果您确实需要 Python 来执行拆分,shlex.split()请实现您假设 Python 常规split函数将遵守的规则。事实并非如此;它只是在您提供的字符串上拆分,不支持转义等。

凤凰求蛊

您有 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 时,您就没有重定向、通配符扩展、作业控制和大量其他 shell 功能。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python