一般来说,没有办法从一个外壳来做这件事。你要做的是运行终端程序本身,或者一些为你这样做的启动程序。对于每个终端程序,实现这一点的方法是不同的。

在某些情况下,^{}会做你想做的,但这不会是通用的。

另外,请注意,通常情况下,您需要脚本的绝对路径,因为新的终端窗口将运行一个新的shell,因此不一定具有相同的工作目录。但我会忽略这个例子。

使用Windows cmd,最简单的方法是^{}shell命令。如果您的start是任何命令行程序,包括python,它将得到一个新的命令行窗口。所以,有点像:subprocess.call('start /wait python bb.py', shell=True)

OS X有一个类似的命令^{}。它是一个真正的程序,而不是shell命令,所以您不需要shell=True。但是,使用open运行命令行程序或脚本通常不会打开新的终端窗口。事实上,它的全部意义是允许你像在Finder中双击一样运行程序,Finder永远不会在终端中运行任何东西,除非它是一个.command文件。

因此,您可以创建一个临时的.command包装文件和open;类似于以下内容(未测试):with tempfile.NamedTemporaryFile(suffix='.command') as f:

f.write('#!/bin/sh\npython bb.py\n')

subprocess.call(['open', '-W', f.name])

或者,您可以显式地告诉open使用Terminal.app,如下所示:subprocess.call(['open', '-W', '-a', 'Terminal.app', 'python', '--args', 'bb.py'])

或者可以通过AppleEvents编写Terminal.app脚本。例如:appscript.app('Terminal').do_script('python bb.py')

“do script”事件打开一个新窗口,并将其参数作为命令运行。如果您想要更详细的控制,请在AppleScript编辑器中打开脚本字典,查看您可以做的所有有趣的事情。

在Linux或其他*nix系统上…有65102种不同的桌面环境、启动程序和终端程序。你需要把它们都处理掉吗?

对于gnome terminal,只需再次运行该终端,您就可以看到一个新窗口,-x参数允许您指定一个初始命令,因此:subprocess.call(['gnome-terminal', '-x', 'python bb.py'])

许多较旧的终端尝试与xterm兼容,后者与-e的功能相同,因此:subprocess.call(['xterm', '-e', 'python bb.py'])

subprocess.call(['rxvt', '-e', 'python bb.py'])

……等等

你如何知道用户正在使用哪个终端?好问题。你可以像你自己一样走父进程,直到你找到一个像终端的东西。或者你可以假设每个人都有xterm。或者您可以查看各种发行版如何配置默认终端并搜索所有终端。或者