ps-o cmd=<;PID>;不能从Python中给出相同的输出

ps-o cmd=<;PID>;不能从Python中给出相同的输出,python,python-2.7,Python,Python 2.7,来自Python: output = os.popen("ps -o cmd=1").read() print output 输出: 1 /bin/bash python myPython.pyc sh -c ps -o cmd=1 ps -o cmd=1 但当我从终端运行该命令时,它会返回我想要的: /sbin/init 另外,当我从python运行“ls-l”命令时,它返回正确的结果 我的主要目的是从Python中的PID中查找进程的名称。 我该怎么办?这并不能回答为什么会得到不同的

来自Python:

output = os.popen("ps -o cmd=1").read()
print output
输出:

1
/bin/bash
python myPython.pyc
sh -c ps -o cmd=1
ps -o cmd=1
但当我从终端运行该命令时,它会返回我想要的:

/sbin/init
另外,当我从python运行“ls-l”命令时,它返回正确的结果


我的主要目的是从Python中的PID中查找进程的名称。
我该怎么办?

这并不能回答为什么会得到不同的输出,但解决目标的更好方法是:

  • 打开并阅读
    /proc//cmdline
    ,或
  • 阅读符号链接
    /proc//exe
  • 编辑:去掉那里的
    popen
    调用和随后的“无用使用
    cat
    ”。改为这样做:

    with open("/proc/"+data.get("pid")+"/cmdline") as cmd:
        cmdinfo=cmd.read()
    command=cmdinfo.split("\0")
    print command[0]
    

    我知道您现在有了答案,但您最初的尝试没有成功的原因可能是因为popen创建了一个全新的流程,因此创建了一个不同的流程环境

    当我从终端运行“ps-o cmd=1”时,得到的结果与您使用popen时的结果类似

    1
    bash
    ps -o cmd=1
    

    我会在python文档中为
    popen
    “自版本2.6以来已弃用:此函数已过时。请使用子流程模块。尤其要检查“用子流程模块替换旧函数”部分。“我认为实现目标的更好方法是打开并阅读
    /proc/1/cmdline
    。或者解释符号链接
    /proc/1/exe
    @IanMcLaird我也尝试过子流程,但它给出了相同的输出。@twalberg-Oh“cat/proc/1/cmdline”有效!我的代码:
    print os.popen(“cat/proc/”+data.get(“pid”)+“/cmdline”).read()
    @furkant请参见编辑中关于摆脱不受欢迎的
    os.popen
    和无用的
    cat
    。@furkantokac
    os.popen(“cat…”)的部分,至少启动了一个,可能启动了两个全新的进程(一个用于“/usr/bin/cat”可能是一个shell,也就是说,实际运行的是类似于
    /usr/bin/bash-c”/usr/bin/cat…
    ),这比在当前进程中仅调用标准库函数来打开和读取文件的效率要低得多。特别是因为您所做的只是读取文件的确切内容,而不是以任何方式对其进行过滤或转换(在大多数情况下,使用本机Python代码仍然可以更有效地完成)。