[解決済み】Pythonで現在実行されているファイルのパスを取得する方法は?
質問
これは初心者の質問のように見えるかもしれませんが、そうではありません。一般的なアプローチでも、すべてのケースでうまくいくとは限りません。
sys.argv[0]です。
を使うということです。
path = os.path.abspath(os.path.dirname(sys.argv[0]))
しかし、これは別のディレクトリにある別のPythonスクリプトから実行している場合はうまくいきませんし、これは実際に起こりうることです。
__file__
これは
path = os.path.abspath(os.path.dirname(__file__))
しかし、これではうまくいかないことがわかりました。
-
py2exe
には__file__
属性がありますが 回避策 -
から実行すると
IDLE
と
execute()
はありません。__file__
属性 -
Mac OS X v10.6
(Snow Leopard)を取得しました。
NameError: global name '__file__' is not defined
関連する質問で、回答が未完成のもの
- 現在実行中のファイルへのパスを検索
- 現在のファイルへのパスは、プログラムの実行方法によって異なります。
- Pythonで実行中のスクリプトのパスを知るにはどうしたらいいですか?
- ディレクトリをPythonスクリプトのディレクトリに変更する
を探しています。 汎用ソリューション 上記のすべてのユースケースで動作するものです。
更新情報
以下はテストケースの結果です。
の出力
python a.py
(Windowsの場合)
a.py: __file__= a.py
a.py: os.getcwd()= C:\zzz
b.py: sys.argv[0]= a.py
b.py: __file__= a.py
b.py: os.getcwd()= C:\zzz
a.py
#! /usr/bin/env python
import os, sys
print "a.py: sys.argv[0]=", sys.argv[0]
print "a.py: __file__=", __file__
print "a.py: os.getcwd()=", os.getcwd()
print
execfile("subdir/b.py")
ファイル サブディレクトリ/b.py
#! /usr/bin/env python
import os, sys
print "b.py: sys.argv[0]=", sys.argv[0]
print "b.py: __file__=", __file__
print "b.py: os.getcwd()=", os.getcwd()
print
ツリー
C:.
| a.py
\---subdir
b.py
解決方法は?
実行されているメインスクリプトの場所を直接特定することはできません。 結局のところ、スクリプトはファイルから全く来ていないこともある。 例えば、対話型インタプリタから来る場合もあるし、メモリにのみ格納された動的に生成されたコードから来る場合もある。
しかし、モジュールは常にファイルからロードされるため、モジュールの場所を確実に特定することができます。 次のようなコードでモジュールを作成し、メインスクリプトと同じディレクトリに置くと、メインスクリプトはそのモジュールをインポートし、それを使って自分自身の位置を特定することができるのです。
some_path/module_locator.py:
def we_are_frozen():
# All of the modules are built-in to the interpreter, e.g., by py2exe
return hasattr(sys, "frozen")
def module_path():
encoding = sys.getfilesystemencoding()
if we_are_frozen():
return os.path.dirname(unicode(sys.executable, encoding))
return os.path.dirname(unicode(__file__, encoding))
some_path/main.py:
import module_locator
my_path = module_locator.module_path()
複数のメインスクリプトが異なるディレクトリにある場合、module_locator のコピーが複数必要な場合があります。
もちろん、メインスクリプトが他のツールによってロードされ、スクリプトと同じ場所にあるモジュールをインポートできない場合は、運が悪いとしか言いようがありません。 そのような場合、あなたが求める情報はプログラムのどこにも存在しないのです。 最善の策は、ツールの作者にバグを報告することでしょう。
関連
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み] Pythonで文字列の部分文字列を取得するにはどうすればよいですか?
-
[解決済み] Pythonでパスから拡張子なしでファイル名を取得する方法は?
-
[解決済み] 現在のファイルのディレクトリのフルパスを取得するにはどうすればよいですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonショートビデオクローラーチュートリアル
-
Pythonの画像ファイル処理用ライブラリ「Pillow」(グラフィックの詳細)
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み] カレントディレクトリとファイルのディレクトリを検索する [重複]。
-
[解決済み] 親フォルダからモジュールをインポートする
-
[解決済み] C言語で実行ファイルの場所を見つけるにはどうしたらいいですか?[重複]する