通常没有办法从 shell 中执行此操作。您需要做的是运行终端程序本身,或一些为您执行此操作的启动程序。而且每个终端程序的实现方式都不同。
在某些情况下,os.startfile 会做你想做的事,但这不会是通用的。
另外,请注意,一般来说,您实际上需要脚本的绝对路径,因为新的终端窗口将运行新的 shell,因此不一定有相同的工作目录。但是对于示例,我将忽略这一点。
使用 Windows cmd,最简单的方法是使用 start shell 命令。如果你start 是任何命令行程序,包括python,它将获得一个新的cmd 窗口。所以,像:
subprocess.call('start /wait python bb.py', shell=True)
OS X 有一个类似的命令,open。它是一个真正的程序而不是一个 shell 命令,所以你不需要shell=True。但是,使用open 运行命令行程序或脚本通常不会打开新的终端窗口。事实上,它的全部意义在于允许您运行程序,就好像它们在 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')
“执行脚本”事件打开一个新窗口并将其参数作为命令运行。如果您想要更详细的控制,请在 AppleScript 编辑器中打开脚本字典,看看您可以做的所有有趣的事情。
在 Linux 或其他 *nix 系统上……嗯,有 65,102 种不同的桌面环境、启动器和终端程序。您需要处理所有这些吗?
使用 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。或者您可以查看各种发行版如何配置默认终端并搜索所有这些。或者……