top 命令在控制台中工作,但在使用 Python 子进程时不起作用

问题描述 投票:0回答:1

我想使用特定的 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 bash subprocess
1个回答
0
投票

使用 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] 包含所有所需字段您已指定。

© www.soinside.com 2019 - 2024. All rights reserved.