デスクトップには、次のファイルを含む_DIR1
_と_DIR2
_の2つのディレクトリがあります。
_DIR1:
file1.py
DIR2:
file2.py myfile.txt
_
ファイルには次のものが含まれます。
_import sys
sys.path.append('.')
sys.path.append('../DIR2')
import file2
_
_import sys
sys.path.append( '.' )
sys.path.append( '../DIR2' )
MY_FILE = "myfile.txt"
myfile = open(MY_FILE)
_
_some text
_
現在、2つのシナリオがあります。 1つ目は機能し、2つ目はエラーになります。
私はcd
を_DIR2
_に入れ、_file2.py
_を実行しますが、問題はありません。
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
_と同じディレクトリにあるのにエラーがスローされた場合、なぜこれが起こるのですか?ありがとうございました。
モジュールの__file__
属性を使用して、モジュールに相対するパスを作成できます。例えば:
myfile = open(os.path.join(
os.path.dirname(__file__),
MY_FILE))
これは、スクリプトをどこから開始するかに関係なく、必要なことを行う必要があります。
交換
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)