这里的目标是在现有shell中的新shell和现有python文件中运行新的python文件。说我有两个文件,aaa.py和bbb.py.让我们说简单,所有aaa.py都是......
subprocess.call('python bbb.py', shell=True)
...让我们说bbb.py确实是......
print 'It worked'
现在的目标是在终端1中运行aaa.py并让它在终端2中启动bbb.py。我希望下面的命令存在,但无法弄明白。
subprocess.call_in_new_window('python bb.py', shell=True)
答案 0 :(得分:30)
一般来说,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')
“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'])
......等等。
您如何知道用户使用的是哪个终端?好问题。您可以从自己的父进程中走过,直到找到看起来像终端的东西。或者你可以假设每个人都有xterm
。或者您可以查看各种发行版如何配置默认终端并搜索所有这些终端。还是......
答案 1 :(得分:2)
你无法做到这一点,至少不像你想的那样简单。我怀疑你是因为“终端窗口”而谈论Mac。
您可能能够使用X Window系统实现这一目标,但您需要设置一系列内容,X服务器,权限等才能实现这一目标。
现在,这些事情通常会违反正常的安全边界。假设您下载的程序符合您的建议。它会显示一个窗口(终端)(对您来说是不可见的),它具有与您相同的权限。它继续读取您的所有目录和文件,并将它们发送到程序的发起者。你可能对此不满意。一直以来,你认为你正在玩游戏,然后你退出,第二个shell继续运行。
Windows和shell有点不相交。
答案 2 :(得分:1)
这可能应该是评论,但由于我还不能...
在Windows中,您可以执行以下操作:
subprocess.call('python bb.py', creationflags=subprocess.CREATE_NEW_CONSOLE)