如何使用sys.path.append在python中导入文件?

Hun*_*nle 7 python relative-path filepath sys python-2.7

有我的桌面上两个目录,DIR1并且DIR2包含下列文件:

DIR1:
file1.py

DIR2:
file2.py  myfile.txt
Run Code Online (Sandbox Code Playgroud)

这些文件包含以下内容:

file1.py

import sys

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

import file2
Run Code Online (Sandbox Code Playgroud)

file2.py

import sys

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

MY_FILE = "myfile.txt"

myfile = open(MY_FILE) 
Run Code Online (Sandbox Code Playgroud)

myfile.txt文件

some text
Run Code Online (Sandbox Code Playgroud)

现在,有两种情况.第一个工作,第二个给出错误.

场景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'
Run Code Online (Sandbox Code Playgroud)

但是,这对我来说没有任何意义,因为我已经添加了file1.py使用命令的路径sys.path.append('../DIR2').

为什么会发生这种情况file1.py,当file2.py它在同一目录中时myfile.txt它会抛出错误?谢谢.

lar*_*sks 7

您可以使用模块的__file__属性创建相对于模块的路径.例如:

myfile = open(os.path.join(
    os.path.dirname(__file__),
    MY_FILE))
Run Code Online (Sandbox Code Playgroud)

无论您在何处启动脚本,都应该按照自己的意愿行事.


dem*_*hog 5

代替

MY_FILE = "myfile.txt"
myfile = open(MY_FILE)
Run Code Online (Sandbox Code Playgroud)

MY_FILE = os.path.join("DIR2", "myfile.txt")
myfile = open(MY_FILE)
Run Code Online (Sandbox Code Playgroud)

这就是您的问题的评论所指的相对路径解决方案。这假设您从myfile.txt 的上一级目录运行它......所以它并不理想。

如果您知道my_file.txt始终与file2.py位于同一目录中,那么您可以在file2中尝试类似的操作...

from os import path

fname =  path.abspath(path.join(path.dirname(__file__), "my_file.txt"))
myfile = open(fname)
Run Code Online (Sandbox Code Playgroud)