当我运行任何Python脚本时,我希望看到脚本的文件名出现在Windows命令行窗口的标题栏中。例如,如果我运行一个名为“mytest.py”的脚本,我想在标题栏中看到“mytest”。我希望这是自动的,因此不必在每个脚本中都添加代码。

目前,我正在尝试使用sitecustomize.py进行此操作,因为运行Python(包括双击Python脚本)时,会在脚本运行之前导入sitecustomize

我尝试获取__main____file__sys.argv,但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']

最佳答案

我很高兴你问!现在,我可以将其用于我的脚本,而且非常酷。

这是代码:

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邮件列表中的人员,尤其是Thomas Heller,帮助解决了该问题的“设置标题”部分。

10-07 19:11
查看更多