我想使用特定的 top 命令并将结果保存到文件中。在控制台中使用它工作正常,但是当在 python 中使用子进程尝试相同的操作时,它会显示错误。我正在使用 Linux Fedora 41。
在控制台中使用此命令输出我想要的结果,同时保存到文件:
top -b -n 1000 -d 1 -p `pgrep Discord | tr "\\n" "," | sed 's/,$//'` > test.txt
但是在带有子进程的Python程序中使用它时:
import subprocess
bashCommand = """ top -b -n 1000 -d 1 -p `pgrep Discord | tr "\\n" "," | sed 's/,$//'` """
print(bashCommand)
with open("test.txt", "w") as outfile:
proces = subprocess.call(bashCommand, shell=True, stdout=outfile)
它抛出:
top: option requires an argument -- 'p'
这是为什么以及如何解决?
Process Discord 已打开,我在 Firefox 和其他浏览器中尝试了相同的操作,但没有成功。
使用 Python 尝试更强大的方法来实现您的目标。你的语法有点问题,应该避免反引号,而且你的语法不太理想。而且也没有错误检查或优雅地打破代码的方法。
使用辅助函数和监控 Discord 函数的更强大示例。如果需要,您还可以轻松更改流程以将其用于任何用途。
更新代码
import subprocess
# Helper function, get all the PIDs
def get_process_pids(process_name):
# Use pgrep to find all PIDs for the specified process name
result = subprocess.run(["pgrep", process_name], stdout=subprocess.PIPE, text=True)
pids = result.stdout.strip().replace("\n", ",")
return pids if pids else None
# Monitor the prcoess
def monitor_process(process_name):
pids = get_process_pids(process_name)
if not pids:
print(f"No processes found for '{process_name}'.")
return
# Run the top command with the specified PIDs
top_command = ["top", "-b", "-n", "1000", "-d", "1", "-p", pids]
with open("/tmp/test.txt", "w") as output_file:
process = subprocess.Popen(top_command, stdout=output_file, text=True)
try:
process.communicate()
except KeyboardInterrupt:
print("Monitoring interrupted.")
finally:
process.terminate()
if __name__ == "__main__":
# Set the process name here
process_name = "Discord"
monitor_process(process_name)
解释
subprocess.Popen:创建一个新进程来执行命令。与等待命令完成的 subprocess.run 不同,Popen 允许命令异步运行,这意味着脚本继续运行并可以与进程交互或监视进程。因此,您可以使用 Ctrl + C 立即结束监控。
top_command:这是Popen将执行的命令。在本例中,top_command 是一个列表:["top", "-b", "-n", "1000", "-d", "1", "-p", pids] 包含所有所需字段您已指定。