Python如何从每个文件得到项目根目录的绝对路径
问题简介
在开发程序时,如果各种资源文件的路径都是硬编码的,那么如果部署环境中的路径与开发环境不同,则该程序将无法正常工作。
为了解决这个问题,有必要动态获得程序中各种资源的绝对路径。 常规资源文件放置在项目根目录下的某些子目录中。
因此,只要可以动态获取项目根目录的绝对路径,就可以准确定位各种资源文件。
以这种方式编写的程序无论在哪里部署都可以正常运行,通常称为“绿色软件”,并且在解压缩后可以正常运行。
本文将介绍的是使用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文件作为可执行程序是无关的。