用Python设置Windows命令行终端标题

31

我在 Windows 机器上运行了几个特定 Python 脚本实例,每个脚本实例来自不同的目录,并使用单独的 shell 窗口。不幸的是,Windows 让这些 shell 窗口都具有相同的名称:

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

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


https://stackoverflow.com/a/62709559/11667949 - Shivam Jha
10个回答

56
在Windows上,一个简单的控制台命令就足够了:
from os import system
system("title " + myCoolTitle)

简单易懂。


1
我将正确答案标记移到了这个回答,因为它能够正常工作且没有依赖项。 - Jonathan Livni
5
@Jonathan Jeffrey的回答更好,因为它没有任何依赖项,而且它也不会调用shell。 - Piotr Dobrogost
3
这个答案的好处是,如果用户拥有管理员权限,cmd shell的内置“标题”命令会在标题前面添加“Administrator: ”。 - Eryk Sun
1
另一个好处是,它可以在前面加上system("cls")来清除窗口中的旧杂物。 - dotswe
Linux怎么样? - undefined

49

这适用于 Windows 下的 Python2.7。

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

30
使用 ctypes.windll.kernel32.SetConsoleTitleW("My New Title") 可以在 Python 3 中设置控制台窗口的标题。 - VGE
反过来怎么样?从命令提示符中打开一个 Python 实例,并指定新 Python 实例的标题。 - Musixauce3000
4
为了实现最高的可移植性并且避免使用 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 错误码。 - Eryk Sun
ctypes和system之间还有一个区别。后者将保留“命令提示符 - “C:\ Anaconda3 \ condabin \ conda.bat” activate <env>”并附加标题,而ctypes将清除它,因此如果您有许多(狭窄的?)窗口,则更好。 - user7660047

26

因为声望值不够,我无法在上面的帖子中添加评论-所以新建一个帖子。

Python 3中,您可以使用:

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

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


1
将UTF-8写入ANSI API是无意义的。你会得到乱码。在Windows编程中,你应该始终优先选择本地宽字符API。ANSI API已经被弃用了。 - Eryk Sun
感谢您的评论。您是正确的,我已经编辑了答案。 - user136036

6

考虑到这个操作只会在Windows上运行(也就是说,没有跨平台的方法来实现这个):

  1. 下载并安装Python的Win32扩展
  2. 在你的脚本中,你可以使用函数更改控制台的标题。

    win32console.SetConsoleTitle("我的超级应用")


5

已发布的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 /自动自诊断消息的替代显示,在长时间运行的过程中高效地显示软实时需求。

3

使用:

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

或者:

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

可能因人而异,但我发现ctypesos.system快得多。 - Jay Dadhania

3

我不知道如何在脚本内部更改cmd窗口标题。

但是,如果你使用start命令启动脚本,你可以设置标题。


1
这是一种不错的方法,因为它没有依赖性,但在我的情况下,脚本只有在读取配置文件后才知道预期的窗口名称... - Jonathan Livni

2
如果选择启动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

1
现在可以通过向控制台(stdout)输出标准转义序列来从任何语言更改窗口标题。这是一个批处理文件的工作示例Change command prompt to only show current directory name,但只需打印ESC关闭括号2分号你的标题BEL(控制-G)即可完成。还有一个易于适应的PHP示例:
function windowTitle($title)
  {printf("\033]2;%s\007", $title);}

2
这不是Python代码的答案(这是问题的要求)。请确保您的答案与问题的范围相符。 - LightCC
@mike_n 不管上面的评论怎么说,这对我很有帮助,谢谢。 - Vopel

1

使用OS模块与终端交互

  1. 导入库 - import os
  2. 通过与终端交互更改标题 - os.system('title your_tile')

解释:

如果您打开终端并键入title your_title,它将把终端标题更改为your_title CMD

在Python中,OS.system()用于在终端中输入命令

这就是如何使用Python更改终端标题的方法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接