为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

茅侃侃 2023-10-25 10:37:19
美好的一天,这应该是相当简单的,但我的谷歌搜索和实验不起作用。我有一个 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())代码就能够运行而不会出现错误。我必须做什么才能解决这个问题?谢谢。
查看完整描述

2 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

自己手动拆分命令行可以显着简化整个问题。

subprocess.run(['pkill', 'Web Content'], check=True)

如果您确实需要 Python 来执行拆分,shlex.split()请实现您假设 Python 常规split函数将遵守的规则。事实并非如此;它只是在您提供的字符串上拆分,不支持转义等。


查看完整回答
反对 回复 2023-10-25
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

您有 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 功能。


查看完整回答
反对 回复 2023-10-25
  • 2 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信