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

时间:2011-06-26 17:54:23

标签: python python-3.x

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

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

我已尝试获取__main__的{​​{1}}和__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

2 个答案:

答案 0 :(得分: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,帮助解决了这个问题的“设置标题”部分。

答案 1 :(得分:1)

  

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

我认为你应该通过一个模块将这个功能添加到你的所有脚本中,而不是通过黑客入侵sitecustomize.py。即使您仍想要使用sitecustomize路径,您也需要从脚本中传递__file__,这意味着您无法为所有脚本添加一些代码。

您当然可以做的是将该代码放入模块中,然后将其导入所有python脚本中。就像我上面提到的,您需要从主脚本传递__file__,否则您将获得模块文件名。此外,无需导入__main__来检索__file__

相关问题