次のPythonコードを検討してください:
_import os
print os.getcwd()
_
私はos.getcwd()
を使用して スクリプトファイルのディレクトリの場所を取得 しています。コマンドラインからスクリプトを実行すると、正しいパスが表示されますが、Djangoビューのコードによって実行されるスクリプトから実行すると、_/
_と表示されます。
Djangoビューによって実行されるスクリプト内からスクリプトへのパスを取得するにはどうすればよいですか?
UPDATE:
これまでの回答をまとめると、os.getcwd()
とos.path.abspath()
はどちらも、スクリプトが存在するディレクトリである場合とそうでない場合がある現在の作業ディレクトリを示します。私のWebホストセットアップでは、___file__
_はパスなしでファイル名のみを提供します。
Python)で、スクリプトが常駐するパスを(常に)受け取ることができる方法はありませんか?
os.path.realpath
で__file__
を呼び出す必要があるので、__file__
がパスなしのファイル名であっても、それでもdirパスが得られます。
import os
print(os.path.dirname(os.path.realpath(__file__)))
sys.path[0]
を試してください。
Pythonのドキュメントから引用するには:
プログラムの起動時に初期化されるので、このリストの最初の項目
path[0]
は、Pythonインタプリタを呼び出すために使用されたスクリプトを含むディレクトリです。スクリプトディレクトリが利用できない場合(例えばインタプリタが対話的に呼び出された場合やスクリプトが標準入力から読み込まれた場合)、path[0]
は空の文字列で、Pythonは現在のディレクトリ内のモジュールを最初に検索します。PYTHONPATH
の結果としてエントリが挿入される前に、スクリプトディレクトリが挿入されていることに注意してください。
私が使う:
import os
import sys
def get_script_path():
return os.path.dirname(os.path.realpath(sys.argv[0]))
Aihamがコメントで指摘しているように、この関数をモジュール内で定義し、それをさまざまなスクリプトで使用することができます。
このコード:
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"呼び出しです。
import os,sys
# Store current working directory
pwd = os.path.dirname(__file__)
# Append current directory to the python path
sys.path.append(pwd)
import os
script_dir = os.path.dirname(os.path.realpath(__file__)) + os.sep
これは私のために働きました(そして私は このスタックオーバーフローの質問 を介してそれを見つけました)
os.path.realpath(__file__)
これはかなり古いスレッドですが、cronジョブからpythonスクリプトを実行するときにスクリプトがある現在のディレクトリにファイルを保存しようとしたときにこの問題が発生していました。 getcwd()と他の多くのパスがあなたのホームディレクトリを思い付きます。
私が使用したスクリプトへの絶対パスを取得する
directory = os.path.abspath(os.path.dirname(__file__))
os.path.abspath('')
を使う
これが私が最後になったものです。スクリプトをインタプリタにインポートした場合や、スクリプトとして実行した場合にも、これは役に立ちます。
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)
これを試して:
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)