2009-03-03 15 views

答えて

58
import __main__ 
print __main__.__file__ 
+1

ニート! __main__をインポートする必要があることを理解することが重要です - ランダムな推測を行い、実際には2行目を試しましたが、失敗しました - なぜ今は知っています。 –

+17

'__main__'は必ずしも' __file__'属性を持っているとは限りません。 – jfs

+0

答えが更新されてそのことが言えるのであれば、うれしいでしょう。 –

27

は、おそらくこれは、トリックを行います:安全のため、あなたは__main__モジュールが__file__属性を持っているかどうかを確認する必要があり、

import sys 
from os import path 
print path.abspath(sys.modules['__main__'].__file__) 

注意を。それは可能性があります場合

python 
>>> import sys 
>>> print sys.modules['__main__'] 
<module '__main__' (built-in)> 
>>> print sys.modules['__main__'].__file__ 
AttributeError: 'module' object has no attribute '__file__' 

シンプルはhasattr()チェックシナリオ2を防ぐためにトリックを行います:それは動的に作成されます、または単に対話的なPythonコンソールで実行されている場合、それは__file__はありませんあなたのアプリで。

+0

ありがとうございます! –

+0

Wunderbar!私は助けることができてうれしいです。これがあなたの質問に答えるならば、その質問に「受け入れる」ボタンを押してもよろしいですか? :-) –

+0

"import __main__"スタイルを使用するようにこれを編集した場合、私は受け入れ済みに戻します。これは新しい受け入れられた回答よりも詳細です。 –

14

以下Pythonコードは、それがpy2exe実行ファイルとシームレスに動作することを含めて、追加の機能を提供します。

実行中のスクリプト(別名__main__)に関連するパスを見つけるために、このようなコードを使用します。追加のメリットとして、Windowsを含むクロスプラットフォームで動作します。

import imp 
import os 
import sys 

def main_is_frozen(): 
    return (hasattr(sys, "frozen") or # new py2exe 
      hasattr(sys, "importers") # old py2exe 
      or imp.is_frozen("__main__")) # tools/freeze 

def get_main_dir(): 
    if main_is_frozen(): 
     # print 'Running from path', os.path.dirname(sys.executable) 
     return os.path.dirname(sys.executable) 
    return os.path.dirname(sys.argv[0]) 

# find path to where we are running 
path_to_script=get_main_dir() 

# OPTIONAL: 
# add the sibling 'lib' dir to our module search path 
lib_path = os.path.join(get_main_dir(), os.path.pardir, 'lib') 
sys.path.insert(0, lib_path) 

# OPTIONAL: 
# use info to find relative data files in 'data' subdir 
datafile1 = os.path.join(get_main_dir(), 'data', 'file1') 

うまくいけば、上記の例のコードは、実行中のスクリプトのパスを決定する方法に追加の洞察を提供することができます...

+1

を使用することができます。起動時にディレクトリを 'os.chdir 'スクリプトを呼び出して 'os.dirname(sys.argv [0])'を呼び出すと結果は無意味です。 – RobM

+0

私は 'GLOBALS.py'モジュールを作成しています。これは少なくともメインスクリプトによってインポートされています。これは上記のコードを実行し、その結果を変数' MAINDIR'に格納するので、 'GLOBALS.MAINDIR'にアクセスできます。 'os.chdir'の使用を心配することなく、他のモジュールから削除することができます。 – Remi

+0

スクリプトの開始ディレクトリを知りたいなら、 'os.chdir()'も使いたいなら、最初の 'os.getcwd()'を保存したいでしょう。ユーザーはウィンドウを開いていたので、py2exeのコンテキスト内で動作し、フリーズするものを実証したかったのです。 – popcnt

1
import sys, os 

def getExecPath(): 
    try: 
     sFile = os.path.abspath(sys.modules['__main__'].__file__) 
    except: 
     sFile = sys.executable 
    return os.path.dirname(sFile) 

この関数はPythonとCythonコンパイルされたプログラムのために動作します。

6

もう1つの方法はsys.argv[0]です。

import os 
import sys 

main_file = os.path.realpath(sys.argv[0]) if sys.argv[0] else None 

sys.argv[0] Pythonは-cまたはPythonのコンソールから確認された場合に開始を取得する場合は、空の文字列になります。

関連する問題