通常情况下,从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
包装文件并打开它;像这样(未经测试):
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系统上... 好吧,有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'])
你如何知道用户正在使用哪个终端?很好的问题。你可以从自己开始遍历父进程链直到找到类似终端的东西。或者你可以假设每个人都有。或者你可以查看各种发行版如何配置默认终端并搜索所有这些终端。或者…