python - 在新的终端窗口中从 python 执行终端命令?

标签 python shell terminal subprocess new-window

这里的目标是在新 shell 中运行新的 python 文件,并在现有 shell 中运行现有的 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)

最佳答案

一般来说,无法从 shell 执行此操作。您所要做的就是运行终端程序本身,或者运行一些为您执行此操作的启动程序。每个终端程序的实现方法都不同。

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

另外,一般来说,您实际上需要脚本的绝对路径,因为新的终端窗口将运行新的 shell,因此不一定具有相同的工作目录。但对于示例,我将忽略这一点。

<小时/>

使用 Windows cmd,最简单的方法是 start shell 命令。如果您启动是任何命令行程序,包括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'])

...等等

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

关于python - 在新的终端窗口中从 python 执行终端命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55157571/

相关文章:

r - 假人的Makefile? Mac OS X

python - Django 收集静态文件失败

Python 3 Pygame 程序不会退出

windows - 在 Windows 中使用 grep、sed、awk 进行 Shell

linux - 在其他 shell 中继续运行脚本的任何方式

ubuntu - 在ubuntu中通过终端访问无线网络

linux - 如何在终端上使用 VIM 配色方案?

python - Pyramid 中所有请求共享的全局变量

python - `object.__setattr__(self, ..., ...)` 而不是 `setattr(self, ..., ...)` ?

windows - 文件中的行数