609

次のPythonコードについて考えてみます。

import os
print os.getcwd()

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

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

更新:
これまでの回答を要約するos.getcwd()と、os.path.abspath()両方とも現在の作業ディレクトリが得られます。これは、スクリプトが存在するディレクトリである場合とそうでない場合があります。私のウェブホストのセットアップ__file__では、パスなしでファイル名のみを提供します。

Pythonには、スクリプトが存在するパスを(常に)受信できる方法はありませんか?

4

12 に答える 12

958

を呼び出す必要があります。これにより、os.path.realpathがパスのないファイル名の場合でも、dirパスを取得できます。__file____file__

import os
print(os.path.dirname(os.path.realpath(__file__)))
于 2012-02-19T16:10:35.347 に答える
190

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

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

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

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

于 2011-03-29T15:43:38.483 に答える
151

私が使う:

import os
import sys

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

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

于 2011-02-09T10:18:07.130 に答える
21

このコード:

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

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

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

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

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

" __file__"は、現在実行中の(スタックの最上位の)スクリプトの名前を示すだけです:"x.py"。パス情報は提供されません。実際の作業を行うのは「os.path.realpath」呼び出しです。

于 2012-05-27T01:59:25.423 に答える
14
import os,sys
# Store current working directory
pwd = os.path.dirname(__file__)
# Append current directory to the python path
sys.path.append(pwd)
于 2011-02-09T07:01:26.460 に答える
9
import os
script_dir = os.path.dirname(os.path.realpath(__file__)) + os.sep
于 2012-02-02T22:42:03.133 に答える
7

使用するos.path.abspath('')

于 2011-02-08T16:06:46.193 に答える
7

これは私のために働きました(そして私はこのstackoverflowの質問を通してそれを見つけました)

os.path.realpath(__file__)
于 2011-09-20T15:38:28.967 に答える
4

これが私が最終的に得たものです。これは、スクリプトをインタープリターにインポートし、スクリプトとして実行する場合にも機能します。

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)
于 2014-08-13T17:57:50.257 に答える
3

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

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

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

于 2012-08-04T21:11:50.977 に答える
0
import os
exec_filepath = os.path.realpath(__file__)
exec_dirpath = exec_filepath[0:len(exec_filepath)-len(os.path.basename(__file__))]
于 2011-11-22T16:47:42.467 に答える
0

これを試して:

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)
于 2014-09-20T13:44:35.957 に答える