在 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 版本?