在 Python 中设置 Windows 命令行终端标题

Posted

技术标签:

【中文标题】在 Python 中设置 Windows 命令行终端标题【英文标题】:Set Windows command-line terminal title in Python 【发布时间】:2011-11-15 06:45:15 【问题描述】:

我在 Windows 机器上运行某个 Python 脚本的多个实例,每个实例来自不同的目录并使用单独的 shell 窗口。不幸的是,Windows 为这些 shell 窗口中的每一个赋予了相同的名称:

<User>: C:\Windows\system32\cmd.exe - <script.py>

是否可以通过 Python 命令将此名称设置为其他名称?

【问题讨论】:

***.com/a/62709559/11667949 【参考方案1】:

这适用于Windows下的Python2.7。

>>> import ctypes
>>> ctypes.windll.kernel32.SetConsoleTitleA("My New Title")

【讨论】:

或者 ctypes.windll.kernel32.SetConsoleTitleW("My New Title") for python 3 反过来呢?从命令提示符打开一个 python 实例并指定新 python 实例的标题。 为了获得最大的可移植性和独立于ctypes.windll(ctypes 中最糟糕的想法)上的缓存原型,请使用kernel32 = ctypes.WinDLL('kernel32', use_last_error=True);kernel32.SetConsoleTitleW(u"My New Title")。还应设置带有签名(result, func, args)errcheck 函数。如果结果为假(即调用失败),它应该raise ctypes.WinError(ctypes.get_last_error()),这使得惯用的 Python 编程能够使用异常而不是粗略的 C 错误代码。【参考方案2】:

在 Windows 上,一个简单的控制台命令就足够了:

from os import system
system("title " + myCoolTitle)

简单又好用。

【讨论】:

我将正确答案标记移至此答案,因为它有效且没有依赖关系 @Jonathan Jeffrey Harper 的回答更好,因为它也没有依赖关系,而且它不调用 shell。 这个答案的好处是如果用户拥有管理员权限,cmd shell 的内置 title 命令会在标题前添加 Administrator: 这样做的另一个好处是它可以在前面加上system("cls") 以清除旧杂乱的窗口。【参考方案3】:

由于没有足够的代表,我无法对上述帖子添加评论 - 所以作为新帖子。

Python 3 中,您可以使用:

import ctypes
ctypes.windll.kernel32.SetConsoleTitleW("My New Title")

我编辑了这个答案:请注意,它现在使用 SetConsoleTitleW,这是 SetConsoleTitle 函数的 Unicode 版本。 这样您就可以使用 unicode 而不再需要将字符串/变量编码为字节对象。您可以将参数替换为字符串变量。

【讨论】:

将 UTF-8 写入 ANSI API 是无稽之谈。你会得到mojibake。在 Windows 编程中,您应该始终更喜欢本机宽字符 API。 ANSI API 几乎已被弃用。 感谢您的评论。你是对的,我编辑了答案。【参考方案4】:

因为你只打算在 Windows 上运行它(IOW,没有跨平台的方式来做到这一点):

    下载并安装Win32 extensions for python

    在您的脚本中,您可以使用 function 更改控制台的标题

    win32console.SetConsoleTitle("My Awesome App")

【讨论】:

【参考方案5】:

我不知道如何从脚本中更改 cmd 窗口标题。

但是,如果您使用start command,则可以在启动脚本时设置标题。

【讨论】:

这是一个很好的方法,因为它没有依赖关系,但是在我的例子中,脚本只有在读取配置文件后才知道预期的窗口名称......【参考方案6】:

已发布的基于system()windll 的方法的比较

想要添加与已发布的两种方法相关的延迟开销的小型定量比较:

|>>> from zmq import Stopwatch
|>>> aSWX = Stopwatch()

|>>> from os import system
|>>> aSWX.start();system( 'TITLE os_SHELL_CMD_TITLE_TXT');aSWX.stop()  15149L [us]
|>>> aSWX.start();system( 'TITLE os_SHELL_CMD_TITLE_TXT');aSWX.stop()  15347L [us]
|>>> aSWX.start();system( 'TITLE os_SHELL_CMD_TITLE_TXT');aSWX.stop()  15000L [us]
|>>> aSWX.start();system( 'TITLE os_SHELL_CMD_TITLE_TXT');aSWX.stop()  14674L [us]
|>>> aSWX.start();system( 'TITLE os_SHELL_CMD_TITLE_TXT');aSWX.stop()  14774L [us]
|>>> aSWX.start();system( 'TITLE os_SHELL_CMD_TITLE_TXT');aSWX.stop()  14551L [us]
|>>> aSWX.start();system( 'TITLE os_SHELL_CMD_TITLE_TXT');aSWX.stop()  14633L [us]
|>>> aSWX.start();system( 'TITLE os_SHELL_CMD_TITLE_TXT');aSWX.stop()  15202L [us]
|>>> aSWX.start();system( 'TITLE os_SHELL_CMD_TITLE_TXT');aSWX.stop()  14889L [us]

|>>> from ctypes import windll
|>>> aSWX.start();windll.kernel32.SetConsoleTitleA('DLL');aSWX.stop()   5767L [us]
|>>> aSWX.start();windll.kernel32.SetConsoleTitleA('DLL');aSWX.stop()    643L [us]
|>>> aSWX.start();windll.kernel32.SetConsoleTitleA('DLL');aSWX.stop()    573L [us]
|>>> aSWX.start();windll.kernel32.SetConsoleTitleA('DLL');aSWX.stop()    749L [us]
|>>> aSWX.start();windll.kernel32.SetConsoleTitleA('DLL');aSWX.stop()    689L [us]
|>>> aSWX.start();windll.kernel32.SetConsoleTitleA('DLL');aSWX.stop()    651L [us]

在可能花费大约半毫秒(但不是几十毫秒)的情况下,windll.kernel32 方法似乎很有希望,并且可能更好地用于 WatchDOG / StateVARs 的替代显示/ ProgressLOG / 自动自我诊断消息,在长时间运行的过程中以软实时需求有效显示。

【讨论】:

【参考方案7】:

如果starting the Idle-shell 是一个选项而不是 cmd shell:

idle.py [-c command] [-d] [-e] [-s] [-t title] [arg] ...

-c command  run this command
-d          enable debugger
-e          edit mode; arguments are files to be edited
-s          run $IDLESTARTUP or $PYTHONSTARTUP first
-t title    set title of shell window

【讨论】:

【参考方案8】:

现在可以通过将标准转义序列输出到控制台 (stdout) 从任何语言中更改窗口标题。这是批处理文件Change command prompt to only show current directory name 中的一个工作示例,但是只需打印 ESC 右括号 2 分号 your-title-here BEL (control-G) 即可。也是一个易于改编的 php 示例:

function windowTitle($title)
  printf("\033]2;%s\007", $title);

【讨论】:

【参考方案9】:

在 XYZ 的位置输入您要保留的窗口名称。

import os
os.system("title XYZ")

【讨论】:

请记住:“简洁是可以接受的,但更全面的解释更好。” How-do-I-write-a-good-answer【参考方案10】:

用途:

import ctypes
ctypes.windll.kernel32.SetConsoleTitleW('new title')

或者:

import os
os.system('title new title')

【讨论】:

以上是关于在 Python 中设置 Windows 命令行终端标题的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何在 Windows 中设置默认 Python 版本?

如何通过 windows powershell 命令在 IIS 网站中设置 ID 属性

如何在Windows系统中设置Python程序定时运行

如何在 Windows 的 Git Bash 中设置别名?

在windows中设置环境变量PATH

使用 mod_wsgi 在 Windows XAMPP 中设置 Python 路径