如何从sitecustomize.py中获取脚本的名称/文件?
当我运行任何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 个回答
当我运行任何Python脚本时,我希望在Windows命令行窗口的标题栏中看到脚本的文件名。比如说,如果我运行一个叫“mytest.py”的脚本,我想在标题栏里看到“mytest”。我希望这个过程是自动的,这样我就不需要在每个脚本里都添加代码。
我觉得你应该通过一个模块把这个功能添加到所有脚本中,而不是通过修改sitecustomize.py来实现。即使你想走sitecustomize的路线,你也需要从你的脚本中传递__file__
,这意味着你还是得在所有脚本里添加一些代码。
你可以做的是把那段代码放到一个模块里,然后在所有的Python脚本中导入它。就像我之前提到的,你需要从主脚本中传递__file__
,否则你得到的将是模块的文件名。而且,获取__file__
时并不需要导入__main__
。
很高兴你问这个问题!我现在已经让我的脚本可以正常工作了,效果挺不错的。
这是代码:
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,感谢他们在“设置标题”这个问题上的帮助。