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

这篇博客探讨了如何在不同的操作系统中,如Windows、OS X和Linux,使用Python打开新的终端窗口并执行命令。文章提到了`subprocess.call`函数的用法,以及在Windows中使用'start'命令,OS X中使用'open'命令,以及在Linux中使用'gnome-terminal'或'xterm'等终端模拟器的方式。还讨论了如何处理不同终端环境的兼容性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常,没有办法从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系统上……那么,共有65102种不同的桌面环境,启动器和终端程序。您需要对所有这些进行处理吗?

使用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。或者,您可以查看各种发行版如何配置默认终端并搜索所有终端。要么…

在使用PyInstaller打包Python应用后,若要隐藏终端窗口执行系统命令,通常情况下,添加`-w`或`--noconsole`选项可以隐藏控制台窗口,但如果涉及到需要执行系统命令,这种方法可能会导致程序运行不正常。此时,我们可以利用Python的`subprocess`模块来解决这个问题。 参考资源链接:[Python打包隐藏终端:使用subprocess执行CMD命令](https://wenku.youkuaiyun.com/doc/645341dcea0840391e778f82?spm=1055.2569.3001.10343) 使用`subprocess`模块,我们可以创建一个子进程来执行命令,而无需打开一个可见的终端窗口。下面是一个使用`subprocess`模块中的`Popen`函数来执行CMD命令并隐藏终端窗口的示例: ```python import subprocess # 定义要执行命令 cmd = 'dir' # 示例命令,实际中可以替换为任何系统命令 # 使用Popen创建子进程执行命令,参数stdin, stdout, stderr用于重定向输入输出,以隐藏终端窗口 p = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 使用communicate()方法来获取命令的输出和错误信息 output, error = ***municate() # 如果需要,可以对输出结果进行处理 print(output) ``` 在这个例子中,`subprocess.Popen`创建了一个子进程,并执行了指定的命令。`stdin`, `stdout`, `stderr`参数被设置为`subprocess.PIPE`,这样我们就可以重定向命令的输入、输出和错误信息,使其不会显示在终端窗口中。`communicate()`方法用于读取输出和错误信息,这对于需要处理命令结果的应用程序来说非常有用。 使用`subprocess`模块执行系统命令是一个安全且灵活的方法,特别是在处理需要在后台运行且不影响用户界面的系统任务时。需要注意的是,当`shell=True`时,传入的命令字符串将会被shell解释执行,这可能会带来安全风险,因此在使用时应确保命令字符串的安全性,避免执行不可信的用户输入。 如果你的应用程序需要更复杂的命令行交互,比如实时输入数据到子进程或者处理子进程的实时输出,`subprocess`模块提供了更多的方法和选项来满足这些需求。 参考资源链接:[Python打包隐藏终端:使用subprocess执行CMD命令](https://wenku.youkuaiyun.com/doc/645341dcea0840391e778f82?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值