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

2025-03-06 08:52:00
admin
原创
64
摘要:问题描述:这里的目标是在新 shell 中运行新 python 文件,并在现有 shell 中运行现有 python 文件。假设我有两个文件,aaa.py 和 bbb.py。为了简单起见,假设 aaa.py 所做的就是...subprocess.call('python bbb.py', shell=True...

问题描述:

这里的目标是在新 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)

解决方案 1:

通常,没有办法从 shell 执行此操作。您需要做的是运行终端程序本身,或者运行某个为您执行此操作的启动程序。每个终端程序执行此操作的方式都不同。

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

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


使用 Windows cmd,最简单的方法是使用startshell 命令。如果您要运行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
python bb.py
')
    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')

“执行脚本”事件会打开一个新窗口并将其参数作为命令运行。如果您想要更详细的控制,请在 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'])

… ETC。

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

解决方案 2:

这可能应该是一条评论,但由于我还不能......

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

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

解决方案 3:

您无法实现这一点,至少不会像您想的那么简单。我怀疑您说的是 Mac,因为有“终端窗口”。

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

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

Windows 和 Shell 有点脱节。

解决方案 4:

这可以打开一个新的终端窗口并在其中运行脚本。然后该脚本可以运行另一个 Python 程序。例如:

hostnamectl; # tested on
Operating System: Debian GNU/Linux 12 (bookworm) 
Kernel: Linux 6.1.0-20-amd64
Architecture: x86-64

python --version
Python 3.11.2; # tested on

vim run_script_in_external_terminal.py

#!/usr/bin/env python
import subprocess

process = subprocess.Popen('/usr/bin/mate-terminal -e /run/some/script.sh'.split(), stdout=subprocess.PIPE)
output, error = process.communicate()
if error:
    print(error)
else:
    blockdevices = output
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3878  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2714  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   49  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   49  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   49  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用