python - 如何在python脚本中使用名称(“Web内容”)中的空格来杀死进程
问题描述
美好的一天,这应该是相当直截了当的,但我的谷歌搜索和实验不起作用。
我在 python 中有一个抓取脚本,它使用在 Ubuntu 18 服务器上运行的 Selenium/geckodriver/Firefox。有时它不能正确关闭,Selenium 会在中脚本崩溃,但它会使许多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 个选项:
使用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 功能。
推荐阅读
- ptrace - 关于使用 PTRACE_GETSIGMASK 和 PTRACE_SETSIGMASK 的 AC 示例?
- swift - 如何通过 url 将图像直接从 Google Drive 上传到 ImageView?
- python - OSX上python virtualenv中mysqlclient的问题
- html - 如何使用 ajax 调用在 html div 中显示 xml 文件的内容?
- excel - VBA:从另一个工作表复制图片问题;剪贴板不清除?
- swift - 使用 API 状态监听设备变化确实发生了变化
- grails - Grails Groovy MVC:批量更新从更新 [0] 返回了意外的行数;
- sharepoint - SharePoint Online 每年重置 ID 号
- python - 简单的线性回归模型
- html - 有人可以帮我弄清楚我在 testdome 上的回答有什么问题吗?