在 运行,调试,打包成exe 三个不同场景下获取跟路径,用于解决获取资源文件绝对路径问题。
工具类代码如下:
import sys
import os
from functools import wraps
class ABSPath(object):
"""路径处理工具类"""
@classmethod
def project_asbpath(self):
"""获取当前项目目录"""
project_asbpath = sys.path[1].replace("\\", "/") # 获取当前项目目录,替换斜杠
return project_asbpath
@classmethod
def dir_asbpath(self):
"""获取当前文件所在目录"""
dir_asbpath = os.getcwd().replace("\\", "/") # 获取当前文件所在目录,替换斜杠
# dir_asbpath = sys.path[0].replace("\\", "/") # 获取当前文件所在目录,替换斜杠
return dir_asbpath
@classmethod
def get_file_abspath(self, filepath):
"""使用相对路径拼接绝对路径"""
return os.path.abspath(os.path.join(os.getcwd(), filepath)).replace("\\", "/")
# 当作装饰器函数来使用
def abspath(func):
"""装饰器函数,替换第一个参数[相对文件路径]为绝对文件路径"""
@wraps(func)
def decorate(*args, **kwargs):
new_args = list(args)
new_args[0] = ABSPath.get_file_abspath(new_args[0])
new_args = tuple(new_args)
return func(*new_args, **kwargs)
return decorate
@abspath
def read_file_with_decorator(filename='./tr.txt',num=1):
print('decorator:',filename,num)
def read_file_no_decorator(filename='./tr.txt',num=1):
print('no decorator:',filename,num)
if __name__ == '__main__':
"""测试"""
print(ABSPath.get_file_abspath(''))
read_file_with_decorator('./tr.txt',10)
read_file_no_decorator('./tr.txt',10)
获取当前文件的路径:
import os
import sys
import path
print('***获取当前目录***')
print(os.getcwd())
print(os.path.abspath(os.path.dirname(__file__)))
# __file__ 为当前文件, 如果在ide中运行此行会报错,可改为 path.dirname('.')
# 但是改为.后,就是获得当前目录,接着使用dirname函数访问上级目录
print('***获取上级目录***')
print(os.path.abspath(os.path.dirname(os.path.dirname(__file__))))
print(os.path.abspath(os.path.dirname(os.getcwd())))
print(os.path.abspath(os.path.join(os.getcwd(), "..")))
print('***获取上上级目录***')
print(os.path.abspath(os.path.join(os.getcwd(), "../..")))
print('***一些函数的使用***')
print('[sys.path]:',sys.path)
print("[sys.path[0]]:", sys.path[0])
print("[sys.path[1]]:", sys.path[1])
print('[path.Path]:',path.Path.getcwd())
参考:
https://www.jb51.net/article/170964.htm