Как я могу получить имя/файл скрипта из sitecustomize.py?

Когда я запускаю любой скрипт 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']

person KeJi    schedule 26.06.2011    source источник
comment
Я не уверен, что ваш вопрос? Почему вы не можете просто использовать __file__ ?   -  person Nix    schedule 26.06.2011
comment
Я хочу сделать это для каждого скрипта, не добавляя его в каждый из моих скриптов Python вручную. sitecustomize.py импортируется при каждом запуске Python. Что-то еще непонятно?   -  person KeJi    schedule 26.06.2011
comment
Ваш вопрос не имеет смысла, поэтому нет ответов. Пожалуйста, покажите нам, как вы планируете использовать это.   -  person Nix    schedule 27.06.2011
comment
Я попытался перефразировать свой вопрос. Я надеюсь, что это легче понять. Я просто планирую использовать его для собственного удобства — скажем, если у меня открыто много сценариев, я хочу идентифицировать их с первого взгляда.   -  person KeJi    schedule 28.06.2011


Ответы (2)


Я рад, что вы спросили! Теперь он работает для моих сценариев, и это довольно круто.

Вот код:

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 и, в частности, Томаса Хеллера за помощь в части «установить заголовок» этого вопроса.

person Ethan Furman    schedule 29.07.2011
comment
Не было бы чище сделать sys.argv дескриптором? - person Piotr Dobrogost; 04.04.2017
comment
@PiotrDobrogost: дескрипторы работают только с атрибутами класса, а argv — это атрибут модуля. Итак, если бы это могло работать, это было бы чище, но это не так. - person Ethan Furman; 04.04.2017

Когда я запускаю любой скрипт Python, я хотел бы, чтобы имя файла скрипта отображалось в строке заголовка окна командной строки Windows. Например, если я запускаю скрипт с именем «mytest.py», я хочу видеть «mytest» в строке заголовка. Я бы хотел, чтобы это было автоматически, поэтому мне не нужно добавлять код в каждый из моих сценариев.

Я думаю, вы должны добавить эту функциональность во все свои скрипты с помощью модуля, а не взломав его в sitecustomize.py. Кроме того, даже если вы все еще хотите пройти путь настройки сайта, вам нужно будет передать __file__ из вашего скрипта, а это значит, что вы не успеете добавить код во все свои скрипты.

Что вы, безусловно, можете сделать, так это поместить этот код в модуль, а затем импортировать его во все ваши скрипты Python. Как я упоминал выше, вам нужно передать __file__ из вашего основного скрипта, иначе вы получите имя файла модуля. Также нет необходимости импортировать __main__ для получения __file__.

person DomCyrus    schedule 29.06.2011