启动另一个程序通过Python>另外(Start Another Program From P

2019-07-02 16:19发布

我试图从运行Python的一个外部的,独立的程序。 它不会是正常的一个问题,但程序是一个游戏,并有内置的Python解释器。 当我使用subprocess.Popen,它会启动独立程序,但原计划的Python实例下这样做,让他们分享的第一个Python控制台。 我可以结束的第一个程序很好,但我宁愿有不同的控制台(主要是因为我有控制台开始隐藏,但是当我从Python的启动程序与subprocess.POpen它就会显示)。

我想,如果我能完全启动第二个程序自身,就好像我只是“就可以双击”。 此外,使用os.system不会工作,因为我的目标跨平台的兼容性,而这仅适用于Windows。

Answer 1:

我想,如果我能完全启动第二个程序自身,就好像我只是“就可以双击”。

由于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 /等等 会话,而不是从终端会话。 如果您需要更多的控制孩子的过程中,您将需要查看的文档openxdg-openos.startfile和/或想出不同的解决方案。

最后,只是因为open / xdg-open / os.startfile成功,实际上并不意味着游戏启动正常。 例如,如果启动,然后崩溃之前,它甚至可以创建一个窗口,它仍然看起来像成功的你。

你可能想看看周围的PyPI你想要的东西是做库。 http://pypi.python.org/pypi/desktop看起来像一个可能性。

或者,你可以看看通过发行3177补丁,并挑选你最喜欢的一个。 据我所知,他们都是纯Python,你可以很容易地刚落添加功能在你自己的模块,而不是在osshutil

作为一个快速黑客,你可能能够(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运行子程序,使用相同的终端。 (和它的有很多的其他问题,如阻塞,直到孩子完成。)



Answer 2:

当我使用subprocess.Popen,它会启动独立程序,但原计划的Python实例下这样做...

不正确。

......让他们分享的第一个Python控制台。

是你的问题的症结所在。 如果你希望它在另一个控制台运行则必须运行另一个控制台,并让它运行程序来代替。

......我的目标跨平台兼容性...

对不起,没有跨平台的方式做到这一点。 你需要运行控制台/终端适合的平台。



文章来源: Start Another Program From Python >Separately<