web-dev-qa-db-ja.com

Pythonでスクリプトのディレクトリを見つけるにはどうすればよいですか?

次のPythonコードを検討してください:

_import os
print os.getcwd()
_

私はos.getcwd()を使用して スクリプトファイルのディレクトリの場所を取得 しています。コマンドラインからスクリプトを実行すると、正しいパスが表示されますが、Djangoビューのコードによって実行されるスクリプトから実行すると、_/_と表示されます。

Djangoビューによって実行されるスクリプト内からスクリプトへのパスを取得するにはどうすればよいですか?

UPDATE:
これまでの回答をまとめると、os.getcwd()os.path.abspath()はどちらも、スクリプトが存在するディレクトリである場合とそうでない場合がある現在の作業ディレクトリを示します。私のWebホストセットアップでは、___file___はパスなしでファイル名のみを提供します。

Python)で、スクリプトが常駐するパスを(常に)受け取ることができる方法はありませんか?

477
Jonathan

os.path.realpath__file__を呼び出す必要があるので、__file__がパスなしのファイル名であっても、それでもdirパスが得られます。

import os
print(os.path.dirname(os.path.realpath(__file__)))
647
Czarek Tomczak

sys.path[0]を試してください。

Pythonのドキュメントから引用するには:

プログラムの起動時に初期化されるので、このリストの最初の項目path[0]は、Pythonインタプリタを呼び出すために使用されたスクリプトを含むディレクトリです。スクリプトディレクトリが利用できない場合(例えばインタプリタが対話的に呼び出された場合やスクリプトが標準入力から読み込まれた場合)、path[0]は空の文字列で、Pythonは現在のディレクトリ内のモジュールを最初に検索します。 PYTHONPATHの結果としてエントリが挿入される前に、スクリプトディレクトリが挿入されていることに注意してください。

ソース: https://docs.python.org/library/sys.html#sys.path

144
RED MONKEY

私が使う:

import os
import sys

def get_script_path():
    return os.path.dirname(os.path.realpath(sys.argv[0]))

Aihamがコメントで指摘しているように、この関数をモジュール内で定義し、それをさまざまなスクリプトで使用することができます。

124
neuro

このコード:

import os
dn = os.path.dirname(os.path.realpath(__file__))

"dn"を現在実行中のスクリプトを含むディレクトリの名前に設定します。このコード:

fn = os.path.join(dn,"vcb.init")
fp = open(fn,"r")

(プラットフォームに依存しない方法で) "script_dir/vcb.init"に "fn"を設定し、そのファイルを現在実行中のスクリプトによる読み取り用に開きます。

「現在実行中のスクリプト」は多少あいまいです。プログラム全体が1つのスクリプトで構成されている場合は、それが現在実行中のスクリプトであり、 "sys.path [0]"という解決策で問題なく機能します。しかし、あなたのアプリケーションが、パッケージ "P"をインポートしてスクリプト "B"を呼び出すスクリプトAで構成されている場合、 "P.B"が現在実行されています。 "P.B"を含むディレクトリを取得する必要がある場合は、 "os.path.realpath(__file__)"ソリューションが必要です。

"__file__"は現在実行されている(トップオブスタック)スクリプトの名前を単に与える: "x.py"。パス情報はありません。本当の仕事をするのは "os.path.realpath"呼び出しです。

17
Al Cramer
import os,sys
# Store current working directory
pwd = os.path.dirname(__file__)
# Append current directory to the python path
sys.path.append(pwd)
15
jbcurtin
import os
script_dir = os.path.dirname(os.path.realpath(__file__)) + os.sep
7
beoliver

これは私のために働きました(そして私は このスタックオーバーフローの質問 を介してそれを見つけました)

os.path.realpath(__file__)
7
Dan R

これはかなり古いスレッドですが、cronジョブからpythonスクリプトを実行するときにスクリプトがある現在のディレクトリにファイルを保存しようとしたときにこの問題が発生していました。 getcwd()と他の多くのパスがあなたのホームディレクトリを思い付きます。

私が使用したスクリプトへの絶対パスを取得する

directory = os.path.abspath(os.path.dirname(__file__))

3
James

os.path.abspath('')を使う

3
Jonathan

これが私が最後になったものです。スクリプトをインタプリタにインポートした場合や、スクリプトとして実行した場合にも、これは役に立ちます。

import os
import sys

# Returns the directory the current script (or interpreter) is running in
def get_script_directory():
    path = os.path.realpath(sys.argv[0])
    if os.path.isdir(path):
        return path
    else:
        return os.path.dirname(path)
3
mpontillo

これを試して:

def get_script_path(for_file = None):
    path = os.path.dirname(os.path.realpath(sys.argv[0] or 'something'))
    return path if not for_file else os.path.join(path, for_file)
0
Davious