总结:
使用sys.path.insert添加项目根目录到搜索路径中,作为整个项目的导包路径
使用相对路径打开文件:open(‘../../ab/a.txt’)
使用绝对路径打开文件:open('/usr/project/ab/a.txt')
如果需要获取项目目的导包路径,可以在项目的位置固定py文件中设置一个方法,这个方法的返回值是项目的导包路径
注意:
在项目中我使用鼠标将一个py文件从一个包中拖到另一个包中。
然后使用os.path.abspath('.')获得的路径,发现不论py文件移动到哪个包中,获取的路径都是文件开始创建时所在目录。
然后使用os.path.abspath(__file__)获取路径,发现正是当前文件移动后的路径。
首先创建项目目录结构
先创建项目根目录文件夹pro,在项目根目录下运行下面代码,创建项目目
import os
import sys
#将项目跟根目录添加到搜索路径
root_path = os.path.normpath(os.path.abspath('.'))
sys.path.insert(0, root_path)
#创建目录
os.makedirs('bb/cc/dd/')
#os.path.normpath是格式路径的, 可以根据不同的平台格式化出正确的路径,
#如win中‘\’, linux中是'/’, 这个方法可以格式化这些路径
chang_path = os.path.normpath(os.path.join(root_path, 'bb/cc/dd/'))
#变更路径
os.chdir(chang_path)
#创建文件
open('ff.py', 'w').close()
open('ee.txt', 'w').close()
#变更路径
os.chdir(root_path)
#创建目录
os.makedirs('hh/jj/kk/')
#os.path.normpath是格式路径的, 可以根据不同的平台格式化出正确的路径
chang_path = os.path.normpath(os.path.join(root_path, 'hh/jj/kk/'))
#变更路径
os.chdir(chang_path)
#创建文件
open('mm.py', 'w').close()
生成的目录结构为
然后在ff.py中写入一个方法
def abc():
print('abc')
在ee.txt中写内容:abcdef
在mm.py文件中导入ff.py
import os
import sys
#将项目跟根目录添加到搜索路径
path = os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))))
root_path = os.path.normpath(path)
sys.path.insert(0, root_path)
from bb.cc.dd import ff
def mm():
ff.abc()
mm()
#正常输出结果 打印abc
在mm.py文件中打开ee.txt文件
import os
import sys
#将项目跟根目录添加到搜索路径
path = os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))))
root_path = os.path.normpath(path)
sys.path.insert(0, root_path)
def mm():
with open('bb/cc/dd/ee.txt') as f:
print(f.read())
mm()
#运行报错
"""
报错信息:
Traceback (most recent call last):
File "/home/myubuntu/Desktop/pro/hh/jj/kk/mm.py", line 12, in <module>
mm()
File "/home/myubuntu/Desktop/pro/hh/jj/kk/mm.py", line 10, in mm
with open('bb/cc/dd/ee.txt') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'bb/cc/dd/ee.txt
"""
使用open打开文件的方式有两种:
第一:使用绝对路径, 如下代码:
import os
import sys
#将项目跟根目录添加到搜索路径
path = os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))))
root_path = os.path.normpath(path)
sys.path.insert(0, root_path)
def mm():
#使用绝对路径
file_path = os.path.normpath(os.path.join(root_path, 'bb/cc/dd/ee.txt'))
with open(file_path) as f:
print(f.read())
mm()
#正常输出结果, 打印abcdef
第二:使用相对路径, 如下代码
import os
import sys
#将项目跟根目录添加到搜索路径
path = os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))))
root_path = os.path.normpath(path)
sys.path.insert(0, root_path)
def mm():
#使用相对路径
with open('../../../bb/cc/dd/ee.txt') as f:
print(f.read())
mm()
#正常运行, 打印结果为:abcdef