写点什么

从每个 Python 文件快速得到项目根目录的绝对路径

用户头像
良少
关注
发布于: 2020 年 05 月 05 日

路径问题

开发程序时,如果写死各类资源文件的路径,那么如果部署环境中的路径和开发环境不同,程序就无法正确工作。

为了解决这个问题,需要动态获取程序中各类资源的绝对路径。一般资源文件是放在项目根目录下的一些子目录中的。

因此,只要能够动态得到项目根目录的绝对路径,就能准确定位各类资源文件。

这样写出来的程序,不论部署在哪里都能正常工作,也就是通常说的“绿色软件”,解压即可正确工作。

本文要介绍的,是利用 Python 的宏解决这一问题的方法。


计算程序绝对路径的方法

我八年前写过一篇文章《Python怎样得到资源文件的绝对路径》,该文中,我使用的方法,是得到可执行程序的绝对路径,进而动态计算出项目的根目录。

ABSPATH=None

if name == 'main':

ABSPATH=os.path.abspath(sys.argv[0])
ABSPATH=os.path.dirname(ABSPATH)
print ABSPATH
复制代码


通过拿到第一个参数的绝对路径,我们就知道了程序所在的绝对路径,我们就能够使用 ABSPATH 这个全局变量组装出 我们源码目录下的任意一个文件的绝对路径了!

文件宏的方法

今天要介绍的是利用 Python 的宏来动态计算出项目的根目录的方法。

PROJECT_ABSOLUTE_PATH=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))print('PROJECT_ABSOLUTE_PATH:%s' % PROJECT_ABSOLUTE_PATH)
复制代码

__file__是 Python 的宏,返回的是 Python 文件的路径。os.path.abspath(__file__),返回的是 Python 文件的绝对路径。

上面例子中,该 Python 文件在项目根目录下的第二层目录下,因此通过上述代码可以动态计算出项目的根目录的绝对路径。


宏方法的优势

一般的编程语言,一个项目只有一个程序入口,只有一个可执行程序。因此,使用计算程序绝对路径的方法来获取项目根目录,是非常便利的。


但 Python 是一种脚本语言,它设计的目的就是为了取代 Shell。一个 Python 项目中的很多个 Python 文件作为主程序来运行,是非常正常的。


因此,使用计算程序绝对路径的方法,来获取项目根目录,就会出现问题。比如说,在不同层次的包下的 Python 文件,他们作为程序运行时,其需要提取的项目根目录的层次就会不同。其他被调用的 Python 文件中,难以正确提取项目根目录。


而使用__file__宏时,每个 Python 文件是通过自己的文件相对于项目根目录的层次来获取项目根目录的。与哪个 Python 文件作为可执行程序是无关的。


发布于: 2020 年 05 月 05 日阅读数: 423
用户头像

良少

关注

余好读书,乐思善疑,常攥文以记之。 2018.11.13 加入

编程很多年了,大部分软件技术都会^_^

评论

发布
暂无评论
从每个Python文件快速得到项目根目录的绝对路径