如何从sitecustomize.py中获取脚本的名称/文件?

7 投票
2 回答
1172 浏览
提问于 2025-04-16 20:20

当我运行任何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']

2 个回答

1

当我运行任何Python脚本时,我希望在Windows命令行窗口的标题栏中看到脚本的文件名。比如说,如果我运行一个叫“mytest.py”的脚本,我想在标题栏里看到“mytest”。我希望这个过程是自动的,这样我就不需要在每个脚本里都添加代码。

我觉得你应该通过一个模块把这个功能添加到所有脚本中,而不是通过修改sitecustomize.py来实现。即使你想走sitecustomize的路线,你也需要从你的脚本中传递__file__,这意味着你还是得在所有脚本里添加一些代码。

你可以做的是把那段代码放到一个模块里,然后在所有的Python脚本中导入它。就像我之前提到的,你需要从主脚本中传递__file__,否则你得到的将是模块的文件名。而且,获取__file__时并不需要导入__main__

5

很高兴你问这个问题!我现在已经让我的脚本可以正常工作了,效果挺不错的。

这是代码:

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,感谢他们在“设置标题”这个问题上的帮助。

撰写回答