我用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
这也适用于运行其他程序。有人知道为什么吗?我真的希望这个应用程序能在所有发行版上运行,所以任何帮助都是非常感谢的。在
subprocess.Popen返回带有several useful methods的Popen对象。直接使用os.杀死... 在
如果使用Popen对象的p.terminate()或p.kill()方法,是否会发生同样的情况?在
我没有确切的答案,但以下是几种调查方法:
使用
pstree
检查进程之间的父/子关系。在使用
ps -awux
查看所有进程的完整命令行参数。在注意,使用
shell=True
启动一个shell进程(例如,/bin/bash
),该进程启动mplayer
。这可能是另一个调查途径。两个系统是否使用同一个外壳?在两个系统是否使用相同版本的mplayer?Python?在
试试这个:
我的猜测是。。。在
当您说
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
来解释的。在相关问题 更多 >
编程相关推荐