web-dev-qa-db-ja.com

sys.path.appendを使用してpythonでファイルをインポートするには?

デスクトップには、次のファイルを含む_DIR1_と_DIR2_の2つのディレクトリがあります。

_DIR1:
file1.py

DIR2:
file2.py  myfile.txt
_

ファイルには次のものが含まれます。

file1.py

_import sys

sys.path.append('.')
sys.path.append('../DIR2')

import file2
_

file2.py

_import sys

sys.path.append( '.' )
sys.path.append( '../DIR2' )

MY_FILE = "myfile.txt"

myfile = open(MY_FILE) 
_

myfile.txt

_some text
_

現在、2つのシナリオがあります。 1つ目は機能し、2つ目はエラーになります。

シナリオ1

私はcdを_DIR2_に入れ、_file2.py_を実行しますが、問題はありません。

シナリオ2

cdを_DIR1_に入れ、_file1.py_を実行すると、エラーがスローされます。

_Traceback (most recent call last):
  File "<absolute-path>/DIR1/file1.py", line 6, in <module>
    import file2
  File "../DIR2/file2.py", line 9, in <module>
    myfile = open(MY_FILE)
IOError: [Errno 2] No such file or directory: 'myfile.txt'
_

ただし、コマンドsys.path.append('../DIR2')を使用して_file1.py_へのパスを追加しているため、これは意味がありません。

_file1.py_、_file2.py_が_myfile.txt_と同じディレクトリにあるのにエラーがスローされた場合、なぜこれが起こるのですか?ありがとうございました。

7
Hunle

モジュールの__file__属性を使用して、モジュールに相対するパスを作成できます。例えば:

myfile = open(os.path.join(
    os.path.dirname(__file__),
    MY_FILE))

これは、スクリプトをどこから開始するかに関係なく、必要なことを行う必要があります。

6
larsks

交換

MY_FILE = "myfile.txt"
myfile = open(MY_FILE) 

MY_FILE = os.path.join("DIR2", "myfile.txt")
myfile = open(MY_FILE) 

それはあなたの質問が持っているコメントが相対パスソリューションと呼んでいるものです。これは、myfile.txtから1つ上のディレクトリから実行していることを前提としています...理想的ではありません。

My_file.txtが常にfile2.pyと同じディレクトリにあることがわかっている場合は、file2で次のようなものを試すことができます。

from os import path

fname =  path.abspath(path.join(path.dirname(__file__), "my_file.txt"))
myfile = open(fname)
2