いくつかのSOの質問には、コードの親ディレクトリにアクセスするためのこれらの行があります。 os.path.join(os.path.dirname(__ file__))は何も返しません および os.path.join(os.path.dirname(__ file__))は何も返しません
_import os, sys
parentddir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
sys.path.append(parentddir)
_
os.path.abspath()
が何かの絶対パスを返し、sys.path.append()
がアクセスするコードのパスを追加することを理解しています。しかし、以下のこの不可解な行は何ですか、それは本当に何を意味するのですか?
_os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
_
コードの親ディレクトリを追加する同じ目的を達成する別の方法はありますか?
この問題が発生するのは、ディレクトリをまたがって関数を呼び出しているときに、同じファイル名を共有している場合があるためです。 _script1/utils.py
_および_script2/utils.py
_。 _script1/test.py
_を呼び出す_script2/something.py
_から関数を呼び出していますが、_script2/utils.py
_を呼び出す関数と次のコードが含まれています
_script1/
utils.py
src/
test.py
script2/
utils.py
code/
something.py
_
test.py
_from script2.code import something
import sys
sys.path.append('../')
import utils
something.foobar()
_
something.py
_import os, sys
parentddir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
sys.path.append(parentddir)
import utils
def foobar():
utils.somefunc()
_
これは、スクリプトの場所に関係なくパスを参照する賢い方法です。あなたが参照しているcryptic行は次のとおりです:
_os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
_
3つのメソッドと2つの定数が存在します。
abspath
はパスの絶対パスを返しますjoin
パス文字列への結合dirname
はファイルのディレクトリを返します__file__
_はscript
のファイル名を指しますpardir
は、OSの親ディレクトリの表現を返します(通常は_..
_)したがって、式は実行中のスクリプトの完全パス名をmultiplatform-safeの方法で返します。 hardwire方向を指定する必要はありません。そのため、非常に便利です。
ファイルが置かれている場所の親ディレクトリを取得する他の方法があるかもしれません。たとえば、プログラムには現在の作業ディレクトリos.getcwd()
の概念があります。そのため、os.getcwd()+'/..'
を実行するとうまくいく場合があります。ただし、作業ディレクトリが変更される可能性があるため、これは非常に危険です。
また、ファイルをインポートする場合、作業ディレクトリはインポート先ではなくインポートするファイルを指しますが、___file__
_は常に実際のモジュールのファイルを指すため、安全です。
お役に立てれば!
編集:P.S. -Python 3は、オブジェクト指向の方法でパスを処理できるようにすることで、この状況を大幅に簡略化するため、上記の行は次のようになります。
_from pathlib import Path
Path(__file__).resolve().parent.parent
_
___file__
_は、コードの実行元のファイルを表します
os.path.dirname(__file__)
は、ファイルがあるディレクトリを提供します
_os.path.pardir
_は「..」を表し、現在のディレクトリの1つ上のディレクトリを意味します
os.path.join(os.path.dirname(__file__), os.path.pardir)
は、ディレクトリ名と「..」を結合します。
os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
は上記のパスを解決し、ファイルが存在するディレクトリの親ディレクトリの絶対パスを提供します