亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 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 關注
  • 201 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號