2011-06-26 21 views
7

Pythonスクリプトを実行すると、スクリプトのファイル名がWindowsのコマンドラインウィンドウのタイトルバーに表示されます。たとえば、 ""というスクリプトを実行すると、タイトルバーに "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

あなたの質問は何ですか?なぜあなたは\ _ \ _ファイル\ _ \ _を使用できませんか? – Nix

+0

すべてのスクリプトに対して、私のpythonスクリプトのすべてに手動で追加することなく、そのスクリプトを実行したいと思います。 sitecustomize.pyは、Pythonが起動するたびにインポートされます。何か他のことは不明ですか? – KeJi

+0

あなたの質問は意味をなさないので、答えはありません。これをどのように使用するか計画してください。 – Nix

答えて

1

私は任意のPythonスクリプトを実行すると、私は スクリプトのファイル名 を見たいが、Windowsのコマンドライン ウィンドウのタイトルバーに表示されます。たとえば、私が というスクリプトを "mytest.py"と実行した場合、私は がタイトルバーに "mytest"を見たいと思っています。 私はこれを自動にしたいと思いますので、 私のスクリプトのすべてに のコードを追加する必要はありません。

私はこの機能をすべてのスクリプトにモジュールで追加し、それをsitecustomize.pyにハッキングしないでください。また、あなたがまだサイトカスタマイズパスに行きたい場合でも、スクリプトから__file__を渡す必要があります。つまり、すべてのスクリプトにコードを追加することはありません。

あなたが確かにできることは、そのコードをモジュールに入れて、すべてのPythonスクリプトでインポートすることです。上記のように、__file__をメインスクリプトから渡す必要があります。そうしないと、モジュールfilenameが取得されます。 __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のためにあなたが(Wへの最後の文字の変更)SetConsoleTitleASetConsoleTitleWに変更する必要があります。

どのように動作するのですか?sys.argvオブジェクトがまだ存在するため、オブジェクトを作成してsys.argvに割り当てます。 Pythonが実際のargvをsys.argvに代入すると、オブジェクトが投げられ、__del__メソッドが呼び出されます。 __del__メソッドは実際のargvにアクセスし、それに応じてタイトルバーを設定することができます。私は可能な競争条件を避けるために1秒の睡眠を入れたが、それが必要であるかどうかはわからない。すべてのコマンドライン引数を表示したくない場合は、好きなようにコマンドを前処理することができます。

python-win32メーリングリスト、特にThomas Hellerの方々に、この質問の「タイトル設定」部分を手伝ってくださったことに感謝します。

+0

'sys.argv'を記述子にする方がクリーンではないでしょうか? –

+0

@PiotrDobrogost:記述子はクラス属性でのみ動作し、 'argv'はモジュール属性です。だから、それがうまくいくなら、それはよりきれいになるでしょう - しかし、そうはなりません。 –

関連する問題