Когда я запускаю любой скрипт Python, я хотел бы, чтобы имя файла скрипта отображалось в строке заголовка окна командной строки Windows. Например, если я запускаю скрипт под названием "mytest.py", я хочу видеть "mytest" в заголовке. Я бы хотел, чтобы это было автоматически, поэтому мне не нужно добавлять код в каждый из моих сценариев.
В настоящее время я пытаюсь сделать это с помощью sitecustomize.py, потому что при запуске Python, в том числе при двойном щелчке скрипта Python, sitecustomize импортируется до запуска скрипта.
Я пытался получить __file__ и sys.argv от __main__, но sitecustomize тоже не видит:
файл sitecustomize.py:
import __main__, sys
print "hasattr __main__.__file__:", hasattr(__main__, "__file__")
print "hasattr sys.argv:", hasattr(sys, "argv")
print "-" * 60
файл mytest.py:
import sys
print "__file__ is:", __file__
print "sys.argv is:", sys.argv
raw_input() # don't end the script immediately
выход:
hasattr __main__.__file__: False
hasattr sys.argv: False
------------------------------------------------------------
__file__ is: C:\Documents and Settings\Owner\Desktop\mytest.py
sys.argv is: ['C:\\Documents and Settings\\Owner\\Desktop\\mytest.py']
Ответ 1 · рейтинг 5 · Ethan Furman
Я рад, что вы спросили! Теперь он работает для моих сценариев, и это довольно круто.
Вот код:
import sys
import time
from ctypes import windll
class SetTitle(object):
def __del__(self):
time.sleep(1)
command = ' '.join(sys.argv)
windll.kernel32.SetConsoleTitleA(command)
sys.argv = SetTitle()
Это для Python 2.x - для 3.x вам нужно изменить SetConsoleTitleA на SetConsoleTitleW (последняя буква меняется с A на W).
Как это работает: поскольку объект sys.argv все еще существует, я создаю объект и назначаю его sys.argv; затем, когда Python присваивает фактический argv sys.argv, мой объект отбрасывается и вызывается метод __del__; тогда метод __del__ может получить доступ к реальному argv и соответствующим образом установить строку заголовка. Я включил 1-секундный сон, чтобы избежать любых возможных условий гонки, но я не уверен, что это необходимо. Если вы не хотите видеть все аргументы командной строки, вы можете предварительно обработать команду любым удобным для вас способом.
Я благодарю людей из списка рассылки python-win32 и, в частности, Томаса Хеллера за помощь в части "установить заголовок" этого вопроса.
Ответ 2 · рейтинг 1 · DomCyrus
Когда я запускаю любой скрипт Python, я хотел бы, чтобы имя файла скрипта отображалось в строке заголовка окна командной строки Windows. Например, если я запускаю скрипт с именем "mytest.py", я хочу видеть "mytest" в строке заголовка. Я бы хотел, чтобы это было автоматически, поэтому мне не нужно добавлять код в каждый из моих сценариев.
Я думаю, вы должны добавить эту функциональность во все свои скрипты с помощью модуля, а не взломав его в sitecustomize.py. Кроме того, даже если вы все еще хотите пройти путь настройки сайта, вам нужно будет передать __file__ из вашего скрипта, а это значит, что вы не успеете добавить код во все свои скрипты.
Что вы, безусловно, можете сделать, так это поместить этот код в модуль, а затем импортировать его во все ваши скрипты Python. Как я упоминал выше, вам нужно передать __file__ из вашего основного скрипта, иначе вы получите имя файла модуля. Также нет необходимости импортировать __main__ для получения __file__.