Python:subprocess()为什么在Ubuntu中启动2个进程,在OpenSUSE中启动1个进程?

2024-09-27 22:30:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python编写了一个小的gui前端,允许用户播放internet广播频道。该程序使用Pythons subprocess()初始化mplayer,以便调谐到通道中,例如:

runn = "mplayer http://77.111.88.131:8010"
p = subprocess.Popen(runn, shell=True)
pid = int(p.pid)
wait = os.waitpid(p.pid, 1)

然后保存p.pid,当用户想停止监听时,使用以下代码:

^{pr2}$

这在OpenSUSE中运行得很好,但在Ubuntu中不行。看起来Ubuntu实际上启动了两个独立的进程。终端输出:

Opensuse 11.3版:

$ pgrep mplayer
22845

Ubuntu 10.04:

$ pgrep mplayer
22846
22847

这也适用于运行其他程序。有人知道为什么吗?我真的希望这个应用程序能在所有发行版上运行,所以任何帮助都是非常感谢的。在


Tags: 用户程序httpubuntuguishell频道pid
3条回答

subprocess.Popen返回带有several useful methods的Popen对象。直接使用os.杀死... 在

如果使用Popen对象的p.terminate()p.kill()方法,是否会发生同样的情况?在

我没有确切的答案,但以下是几种调查方法:

使用pstree检查进程之间的父/子关系。在

使用ps -awux查看所有进程的完整命令行参数。在

注意,使用shell=True启动一个shell进程(例如,/bin/bash),该进程启动mplayer。这可能是另一个调查途径。两个系统是否使用同一个外壳?在

两个系统是否使用相同版本的mplayer?Python?在

试试这个:

p = subprocess.Popen(runn.split(), shell=False)

我的猜测是。。。在

当您说shell=True子进程实际上启动了这个命令sh -c "your string"。然后,sh命令将解释字符串并运行该命令,就像您在shell提示符处键入的一样(或多或少)。通常这将导致两个过程。一个是sh -c "your string",另一个是它的子节点your string。在

某些版本的sh有一个优化,在这种优化中,它们将在特定条件下自动exec执行该命令。如果最后一个命令sh要运行,并且sh没有其他理由留下来,它们就会这么做。当使用sh -c运行一个命令时,这几乎总是导致调用sh来替换它正在运行的命令,从而导致一个进程。在

在我看来,用shell=True调用subprocess.Popen是一个非常非常糟糕的主意。这样做会让你自己面对大量的安全问题,以及通常不太可预测的行为,因为shell元字符是由sh -c来解释的。在

相关问题 更多 >

    热门问题