繁体   English   中英

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

[英]Execute terminal command from python in new terminal 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 命令。 如果您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 或者您可以查看各种发行版如何配置默认终端并搜索所有这些。 或者…

这可能应该是一个评论,但因为我还不能......

在 Windows 中,您可以执行以下操作:

subprocess.call('python bb.py', creationflags=subprocess.CREATE_NEW_CONSOLE)

你将无法做到这一点,至少不像你想象的那么简单。 我怀疑您是因为“终端窗口”而谈论 Mac。

您也许可以使用 X Window 系统来实现它,但是您需要设置一堆东西、X 服务器、权限等来实现它。

如今,此类事情通常会违反正常的安全边界。 假设您下载了一个按照您的建议运行的程序。 它会打开一个窗口(终端)(对您不可见),它与您拥有相同的权限。 它继续读取您的所有目录和文件,并将它们发送给程序的创建者。 你可能对此不满意。 一直以来,您认为自己在玩游戏,然后退出,第二个 shell 继续运行。

Windows 和 shell 有点不相交。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM