我试图从运行Python的一个外部的,独立的程序。 它不会是正常的一个问题,但程序是一个游戏,并有内置的Python解释器。 当我使用subprocess.Popen,它会启动独立程序,但原计划的Python实例下这样做,让他们分享的第一个Python控制台。 我可以结束的第一个程序很好,但我宁愿有不同的控制台(主要是因为我有控制台开始隐藏,但是当我从Python的启动程序与subprocess.POpen它就会显示)。
我想,如果我能完全启动第二个程序自身,就好像我只是“就可以双击”。 此外,使用os.system不会工作,因为我的目标跨平台的兼容性,而这仅适用于Windows。
我想,如果我能完全启动第二个程序自身,就好像我只是“就可以双击”。
由于2.7和3.3,Python没有跨平台的方式做到这一点。 一种新的shutil.open
方法可能会在将来被添加(可能不是根据该名称); 见http://bugs.python.org/issue3177了解详情。 但在此之前,你必须编写自己的代码为每个你关心的平台。
幸运的是,你正在试图做的是比更简单,更一般shutil.open
最终希望能够提供,这意味着它并不难代码:
- 在OS X上,有一个名为命令
open
那不正是你想要什么:“打开命令打开一个文件(或目录或URL),就像如果你有双击该文件的图标。” 所以,你可以只popen
open /Applications/MyGame.app
。 - 在Windows上,等效命令是
start
,但不幸的是,这就是部分cmd.exe
外壳,而不是一个独立的程序。 幸运的是,Python带有一个功能os.startfile
,做同样的事情,所以只是os.startfile(r'C:\Program Files\MyGame\MyGame.exe')
- 在Freedesktop的兼容* nix系统(其中包括最现代的Linux发行版,等等),还有被称为一个非常类似的命令
xdg-open
:“XDG-开放打开用户的首选应用程序的文件或网址。” 再次,只是popen
xdg-open /usr/local/bin/mygame
。 - 如果你希望在其他平台上运行,你需要做一点研究,以找到最好的等价物。 否则,除了Mac和Windows的任何东西,我只是尝试
popen
xdg-open
,如果失败,抛出一个错误。
看到http://pastebin.com/XVp46f7X用于(未测试)的例子。
请注意,这只会工作运行的东西,居然能双击在搜索引擎/浏览/鹦鹉螺的/ etc推出。 例如,如果你尝试推出“./script.py”,根据您的设置,它可能只是火了,在它的脚本中的文本编辑器。
此外,在OS X,你想运行。应用程序包,而不是里面的UNIX可执行文件。 (在某些情况下,推出一个UNIX可执行文件,无论是捆绑的.app内部或独立的,可以工作,但不要指望它。)
另外,请记住,启动程序这种方式是不一样的,从命令运行它行,尤其是,它会继承其环境,当前的目录/驱动器等从Windows /发射服务/ GNOME / KDE /等等 会话,而不是从终端会话。 如果您需要更多的控制孩子的过程中,您将需要查看的文档open
, xdg-open
和os.startfile
和/或想出不同的解决方案。
最后,只是因为open
/ xdg-open
/ os.startfile
成功,实际上并不意味着游戏启动正常。 例如,如果启动,然后崩溃之前,它甚至可以创建一个窗口,它仍然看起来像成功的你。
你可能想看看周围的PyPI你想要的东西是做库。 http://pypi.python.org/pypi/desktop看起来像一个可能性。
或者,你可以看看通过发行3177补丁,并挑选你最喜欢的一个。 据我所知,他们都是纯Python,你可以很容易地刚落添加功能在你自己的模块,而不是在os
或shutil
。
作为一个快速黑客,你可能能够(AB)使用webbrowser.open
。 “请注意,在某些平台上,尝试使用此功能打开一个文件名,可以工作,并启动操作系统的相关计划。不过,这既不支持,也不便于携带。” 特别是,IIRC,它不会在OS X 10.5+工作。 但是,我认为,做一个文件:URL出来的文件名实际上并在OS X和Windows工作,也适用于Linux的大多数,但不是所有的配置。 如果是的话,它可能是一个快速和肮脏的剧本不够好。 只要记住它没有记录工作,它可能会打破某些用户,它可能会在未来突破,并对其进行了明确认为滥用的Python开发者,所以任何东西更严重,我不会指望它。 它会启动“script.py”或“Foo.app/Contents/MacOS/foo”,路过ENV变量等如上更正确的方法同样的问题。
几乎一切在你的问题是两个不相干的和错误的:
它不会是正常的一个问题,但程序是一个游戏,并有内置的Python解释器。
这不要紧。 如果游戏是从C代码写入到标准输出,它会做同样的事情。
当我使用subprocess.Popen,它会启动独立程序,但原计划的Python实例下这样做
不,它不需要。 它从一个全新的过程,其嵌入式Python解释器的Python是一个全新的实例。 您可以通过验证,例如,运行不同版本的Python比游戏嵌入。
让他们分享的第一个Python控制台。
不,他们没有。 他们可以共享同一个TTY / cmd窗口,但是这不是一回事。
我可以结束的第一个程序很好,但我宁愿有不同的控制台(主要是因为我有控制台开始隐藏,但是当我从Python的启动程序与subprocess.POpen它就会显示)。
你总是可以管孩子的输出和错误到,例如,一个日志文件,然后你可以从父进程的输出分别查看,如果你想。 但我认为,这是怎么回事关在具有无关,与你真正关心的切线。
此外,使用os.system不会工作,因为我的目标跨平台的兼容性,而这仅适用于Windows。
错误; os.system
可上“的Unix,Windows的” -这可能是无处不在,你所关心的。 但是,它不会工作,因为它在脚本的子shell运行子程序,使用相同的终端。 (和它的有很多的其他问题,如阻塞,直到孩子完成。)
当我使用subprocess.Popen,它会启动独立程序,但原计划的Python实例下这样做...
不正确。
......让他们分享的第一个Python控制台。
这是你的问题的症结所在。 如果你希望它在另一个控制台运行则必须运行另一个控制台,并让它运行程序来代替。
......我的目标跨平台兼容性...
对不起,没有跨平台的方式做到这一点。 你需要运行控制台/终端适合的平台。