2011-05-01 5 views
15

は何か違いがありますスクリプトの名前。違い[0]

違いがなければ、なぜ__file__がほぼすべての場所で使用されているのですが、私はこれまでにsys.argv[0]が使用されているのを見たことがありません。

答えて

11

__file__は、モジュール内にある場合、またはを呼び出すのではなく、execfile()を使用してスクリプトを開始する場合、メインスクリプトと異なる場合があります。 __file__は一般的にあなたのより安全な賭けです。

+0

それはそれを説明します。 – user225312

+1

あなたのスクリプトが '-m'スイッチで実行された場合、sys.argv [0]はファイル名ではなくモジュール名であるかもしれません。バンドルされた実行を使用している場合はディレクトリまたはzipファイル名です。 – ncoghlan

+0

\ __ file \ __は非公開で、直接照会されないはずですか? – Tiago

4

あなたがあなたのpython programmの "メイン"スクリプトにある場合は、同じです。他のファイルをインポートすると、__file__にはそのファイルへのパスが含まれますが、sys.argvには同じ値が保持されます。

0

実際には、argv [0]は、スクリプト名またはスクリプト+スクリプト名の完全パス(osによって異なる場合があります)です。

はここスヴェンが言ったようにですhttp://docs.python.org/py3k/library/sys.html#sys.argv

2

公式ドキュメントのエントリです。

[email protected]: /tmp > cat file.py 
import sys 
import blub 
print __file__ 
print sys.argv[0] 

[email protected]: /tmp > cat blub.py 
import sys 
print "BLUB: " + __file__ 
print "BLUB: " + sys.argv[0] 

[email protected]: /tmp > python file.py 
BLUB: /tmp/blub.pyc 
BLUB: file.py 
file.py 
file.py 

プリプロセッサーステップで__file__がファイル名に置き換えられたと考えました。私は100%確かにそれが実際にはPythonのケースであると確信していませんでしたが、それはC/C++とPerlです。 Pythonでは、__file__がコンパイルされたPythonファイル(pyc)に対しても正しくあり、そのファイルの内容にファイル名のトレースがないように見えるため、これは異なる場合があります。

+0

ルードウィッヒ:もう少し実験をするべきでしょう。 'empty.py'という名前の空のファイルを作成します。 Pythonのインタラクティブなプロンプトで、次の行を入力します: 'import empty; print(空き.__ファイル_);リロード(空)。 print(empty .__ file __) '...あなたの答えを編集します。 –

+0

あなたが正しいと思う - 私は私の答えを更新しました。ありがとう。 – Lumi

+0

ルートヴィヒ:事実: '__file__'はモジュールの属性であり、モジュールがロードされると自動的に作成されます。 CPythonにはプリプロセッサのステップはありません。 –

関連する問題