在新的terminal窗口中执行python的terminal命令?

这里的目标是在现有shell中的现有python文件的新shell中运行新的python文件。 说我有两个文件,aaa.py和bbb.py. 可以说,为了简单,所有aaa.py确实是…

subprocess.call('python bbb.py', shell=True) 

…可以说,bbb.py确实是…

 print 'It worked' 

现在我们的目标是在terminal1上运行aaa.py,并在terminal2上启动bbb.py。我希望下面的命令能够存在,但是不能算出来。

 subprocess.call_in_new_window('python bb.py', shell=True) 

一般来说从shell中无法做到这一点。 你必须做的是运行terminal程序本身,或者一些启动程序,这样做给你。 对于每个terminal程序,这样做的方式是不同的。

在某些情况下, os.startfile会做你想做的事情,但是这不会是通用的。

另外,一般来说,你将实际需要一个绝对path到你的脚本,因为新的terminal窗口将运行一个新的shell,因此不一定有相同的工作目录。 但是我会忽略这个例子。


使用Windows cmd,最简单的方法是start shell命令。 如果你start是包括python任何命令行程序,它将得到一个新的cmd窗口。 所以,像这样的:

 subprocess.call('start /wait python bb.py', shell=True) 

OS X有一个类似的命令, open 。 这是一个真正的程序,而不是一个shell命令,所以你不需要shell=True 。 但是,通过open运行命令行程序或脚本通常不会打开新的terminal窗口。 事实上,它的全部重点就是允许你运行程序,就像在Finder中双击一样,除非它是一个.command文件,否则它永远不会在terminal上运行。

所以,你可以创build一个临时的.command包装文件并open它; 像这样(未经testing):

 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 Editor中打开脚本字典,并查看您可以执行的所有有趣的事情。


在Linux或其他* nix系统……好吧,有65,102个不同的桌面环境,启动器和terminal程序。 你需要在所有这些工作吗?

使用gnome-terminal,再次运行terminal会给你一个新的窗口,而-x参数可以让你指定一个初始命令,所以:

 subprocess.call(['gnome-terminal', '-x', 'python bb.py']) 

许多旧的terminal试图与xterm兼容,它与-e做同样的事情,所以:

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

…等

你怎么知道用户正在使用哪个terminal? 好问题。 你可以像从你自己的父进程走,直到你find一个看起来像一个terminal的东西。 或者你可以假设每个人都有xterm 。 或者你可以看看各种发行版如何configuration一个默认的terminal并search所有的terminal。 要么…

你将无法做到这一点,至less不会像你想的那样简单。 我怀疑你是因为“terminal窗口”而在谈论Mac。

你可以使用X Window系统来实现,但是你需要设置一些东西,X服务器,权限等来实现。

这些日子通常会违反正常的安全边界。 假设你下载了一个你所build议的程序。 它带来了一个窗口(terminal)(你看不见),具有相同的权限,你有。 它继续阅读所有的目录和文件,并将它们发送给程序的创始者。 你可能不满意。 整个过程中,你认为你在玩游戏,然后你退出了,第二个shell继续运行。

Windows和shell有点不相交。