web-dev-qa-db-ja.com

os.path.abspath(os.path.join(os.path.dirname(__ file__)、os.path.pardir))はどういう意味ですか? python

いくつかの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()
_
15
alvas

これは、スクリプトの場所に関係なくパスを参照する賢い方法です。あなたが参照しているcryptic行は次のとおりです:

_os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
_

3つのメソッドと2つの定数が存在します。

  1. abspathはパスの絶対パスを返します
  2. joinパス文字列への結合
  3. dirnameはファイルのディレクトリを返します
  4. ___file___はscriptのファイル名を指します
  5. pardirは、OSの親ディレクトリの表現を返します(通常は_.._)

したがって、式は実行中のスクリプトの完全パス名multiplatform-safeの方法で返します。 hardwire方向を指定する必要はありません。そのため、非常に便利です。

ファイルが置かれている場所の親ディレクトリを取得する他の方法があるかもしれません。たとえば、プログラムには現在の作業ディレクトリos.getcwd()の概念があります。そのため、os.getcwd()+'/..'を実行するとうまくいく場合があります。ただし、作業ディレクトリが変更される可能性があるため、これは非常に危険です。

また、ファイルをインポートする場合、作業ディレクトリはインポート先ではなくインポートするファイルを指しますが、___file___は常に実際のモジュールのファイルを指すため、安全です。

お役に立てれば!

編集:P.S. -Python 3は、オブジェクト指向の方法でパスを処理できるようにすることで、この状況を大幅に簡略化するため、上記の行は次のようになります。

_from pathlib import Path
Path(__file__).resolve().parent.parent
_
30
Paulo Bu

___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))は上記のパスを解決し、ファイルが存在するディレクトリの親ディレクトリの絶対パスを提供します

12
praveen