Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: KeJiОтветов: 2

Когда я запускаю любой скрипт 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']
  • Я не уверен, что ваш вопрос? Почему вы не можете просто использовать __file__ ? Nix 26.06.2011
  • Я хочу сделать это для каждого скрипта, не добавляя его в каждый из моих скриптов Python вручную. sitecustomize.py импортируется при каждом запуске Python. Что-то еще непонятно? KeJi 26.06.2011
  • Ваш вопрос не имеет смысла, поэтому нет ответов. Пожалуйста, покажите нам, как вы планируете использовать это. Nix 27.06.2011
  • Я попытался перефразировать свой вопрос. Я надеюсь, что это легче понять. Я просто планирую использовать его для собственного удобства - скажем, если у меня открыто много сценариев, я хочу идентифицировать их с первого взгляда. KeJi 28.06.2011

python

Ответы

Ответ 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__.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы