28

I'm running several instances of a certain Python script on a Windows machine, each from a different directory and using a separate shell windows. Unfortunately Windows gives each of these shell windows the same name:

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

Is it possible to set this name to something else through a Python command?

user3666197
  • 1
  • 6
  • 45
  • 89
Jonathan Livni
  • 93,232
  • 99
  • 253
  • 352

10 Answers10

45

On Windows, a simple console command will suffice:

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

Nice and easy.

Nick stands with Ukraine
  • 6,365
  • 19
  • 41
  • 49
ShouravBR
  • 595
  • 6
  • 10
  • 1
    I moved the correct answer mark to this answer as it works and has no dependencies – Jonathan Livni Apr 20 '12 at 11:34
  • 3
    @Jonathan Jeffrey Harper's answer is better as there are also no dependencies and in addition it doesn't invoke shell. – Piotr Dobrogost May 15 '13 at 21:38
  • 2
    The benefit of this answer is the cmd shell's builtin `title` command prepends `Administrator: ` to the title if the user has admin rights. – Eryk Sun Jan 18 '17 at 20:33
  • Another advantage with this is that it can be preceded with `system("cls")` to clear the window from old clutter. – dotswe Nov 09 '21 at 03:08
45

This works for Python2.7 under Windows.

>>> import ctypes
>>> ctypes.windll.kernel32.SetConsoleTitleA("My New Title")
Jeffrey Harper
  • 718
  • 7
  • 7
  • 26
    Or ctypes.windll.kernel32.SetConsoleTitleW("My New Title") for python 3 – VGE Oct 16 '14 at 10:26
  • How about the reverse? Open an instance of python from command prompt and specify the title of the new python instance. – Musixauce3000 May 04 '16 at 11:51
  • 3
    For the most portability and independence from cached prototypes on `ctypes.windll` (the worst idea in ctypes), use `kernel32 = ctypes.WinDLL('kernel32', use_last_error=True);` `kernel32.SetConsoleTitleW(u"My New Title")`. An `errcheck` function with signature `(result, func, args)` should also be set. It should `raise ctypes.WinError(ctypes.get_last_error())` if the result is false (i.e. the call failed), which enables idiomatic Python programming with exceptions instead of crude C error codes. – Eryk Sun Jan 18 '17 at 20:32
  • There another DIFFERENCE between ctypes and system. The latter will keep 'Command Prompt - "C:\Anaconda3\condabin\conda.bat" activate ' and APPEND the title, whereas ctypes will CLEAR it, so it's better if you have many (narrow?) windows. – user7660047 Apr 18 '22 at 22:12
24

Due to not enough rep I cannot add a comment to the above post - so as a new post.

In Python 3 you can use:

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

I edited this answer: please remark, that it now uses SetConsoleTitleW, which is the Unicode version of the SetConsoleTitle function. This way you can use unicode and no longer have to encode the string/variable to a byte object. You can just replace the argument with the string variable.

user136036
  • 9,320
  • 5
  • 41
  • 46
  • 1
    Writing UTF-8 to an ANSI API is nonsense. You'll get mojibake. You should always prefer the native wide-character APIs in Windows programming. The ANSI APIs are all but deprecated. – Eryk Sun Jan 18 '17 at 20:35
  • Thank you for the comment. You are correct, I edited the answer. – user136036 Jan 19 '17 at 00:33
6

Since you're only going to be running this on Windows (IOW, there's not a cross-platform way to do this):

  1. Download & install the Win32 extensions for python
  2. Inside of your script, you can change the title of the console with the function

    win32console.SetConsoleTitle("My Awesome App")

bgporter
  • 33,237
  • 8
  • 58
  • 65
3

Comparison of the posted system() & windll-based methods

tying to add a small quantitative comparison of latency overheads associated with two of the posted methods:

|>>> 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]

In cases, where one might spend about a half of millisecond ( but not some tens of that ) the windll.kernel32 method seems promising and may serve better for an alternative display of a WatchDOG / StateVARs / ProgressLOG / auto-self-diagnostic messages, being efficiently displayed in a soft real-time need, during long running processes.

user3666197
  • 1
  • 6
  • 45
  • 89
3

I am not aware of a way to change the cmd window title from within the script.

However, you can set the title when launching the script if you use the start command.

NPE
  • 464,258
  • 100
  • 912
  • 987
  • 1
    This is a nice way to do it as it has no dependencies, however in my case the script only knows the intended window name after it reads a configuration file... – Jonathan Livni Sep 13 '11 at 05:19
2

If starting the Idle-shell is an option instead of the 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
Remi
  • 19,453
  • 8
  • 53
  • 41
0

It is now possible to change the window title from within any language via outputting a standard escape sequence to the console (stdout). Here's a working example from a batch file Change command prompt to only show current directory name however just printing ESC close-bracket 2 semicolon your-title-here BEL (control-G) will do it. Also an easily adapted PHP example:

function windowTitle($title)
  {printf("\033]2;%s\007", $title);}
mike_n
  • 1
0

In place of XYZ, enter the window name you want to keep.

import os
os.system("title XYZ")
  • Please remember that: "Brevity is acceptable, but fuller explanations are better." [How-do-I-write-a-good-answer](https://stackoverflow.com/help/how-to-answer) – Ahx Aug 28 '20 at 07:02
0

Use:

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

Or:

import os
os.system('title new title')
Pixelsuft
  • 21
  • 5