2011-06-26 69 views
7

當我運行任何Python腳本時,我想看到腳本的文件名出現在Windows命令行窗口的標題欄中。例如,如果我運行一個名爲「mytest.py」的腳本,我想在標題欄中看到「mytest」。我希望這是自動的,所以我不必爲每個腳本添加代碼。如何從sitecustomize.py獲取腳本的名稱/文件?

目前我試圖用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'] 
+1

我不確定你的問題是什麼?爲什麼你不能使用\ _ \ _ file \ _ \ _? – Nix

+0

我想爲每個腳本執行此操作,而無需手動將其添加到每個Python腳本中。 Python啓動時隨時導入sitecustomize.py。還有什麼不清楚嗎? – KeJi

+0

你的問題沒有意義,因此沒有答案。請告訴我們你是如何計劃使用它的。 – Nix

回答

1

當我運行任何Python腳本,我會 喜歡看腳本的文件名 出現在Windows命令行 窗口的標題欄。例如,如果我 運行一個名爲「mytest.py」的腳本,I 想要在標題欄中看到「mytest」。 我希望這是自動的,所以 我不必爲我的腳本的每個 添加代碼。

我認爲您應該通過模塊將此功能添加到所有腳本中,而不是通過將其添加到sitecustomize.py中。此外,即使您仍然想要進入sitecustomize路徑,您需要通過腳本中的__file__,這意味着您不會在代碼中添加一些代碼。

你當然可以做的是將該代碼放入一個模塊,然後將其導入到所有的Python腳本中。就像我上面提到的那樣,您需要從主腳本中傳遞__file__,否則您將獲得模塊文件名。也不需要導入__main__來檢索__file__

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的你需要(從最後一個字母變爲W)改變SetConsoleTitleASetConsoleTitleW

工作原理:由於sys.argv對象確實存在,我創建一個對象並將其分配給sys.argv;那麼,當Python將實際的argv分配給sys.argv時,我的對象將被拋出,並調用__del__方法;那麼__del__方法就可以訪問真正的argv並相應地設置標題欄。爲了避免任何可能的競賽條件,我把1秒的睡眠放在了一起,但我不確定這是否有必要。如果你不想看到所有的命令行參數,你可以用你喜歡的任何方式預處理命令。

感謝python-win32郵件列表上的人員和Thomas Heller幫助解決此問題的'set title'部分。

+0

使'sys.argv'描述符變得更簡潔嗎? –

+0

@PiotrDobrogost:描述符只能用於類屬性,而'argv'是模塊屬性。所以,如果它能工作,它會更乾淨 - 但它不會。 –