Python3获取当前目录与脚本路径的正确方法
本文详解Python3中获取当前目录与脚本所在目录的区别。通过对比os.getcwd()、sys.path[0]与__file__变量,说明在不同执行场景(如打包exe或子模块调用)下的路径差异,并给出使用os.path.realpath()获取准确脚本目录的标准写法,附带获取父目录与绝对路径的代码示例。
旧版常见做法
旧版常见做法
若需获取程序运行时的当前工作目录,可直接调用os模块中的os.getcwd()函数。
若需获取当前正在执行的脚本文件所在的目录,则应使用sys模块的sys.path[0]变量或sys.argv[0]。实际上,sys.path是Python用于查找模块的搜索路径列表,sys.path[0]和sys.argv[0]与sys.path[0]含义一致,因为Python会自动将sys.argv[0]添加到sys.path中。
具体而言,假设在C:\test目录下执行python getpath\getpath.py,此时os.getcwd()返回“C:\test”,而sys.path[0]返回“C:\test\getpath”。
更特殊的情况是,若使用py2exe模块将Python脚本编译为可执行文件,sys.path[0]的输出结果会发生变化:
1. 若以默认方式将依赖库打包为zip文件,sys.path[0]将输出“C:\test\getpath\libarary.zip”;
2. 若在setup.py中指定zipfile=None参数,依赖库将被打包进exe文件内部,此时sys.path[0]输出“C:\test\getpath\getpath.exe”。
(Edit Section ↓)
标准解决方案
标准解决方案
然而,上述方法均不能准确反映脚本文件所在的实际目录。
例如,在C:\test目录下存在一个名为sub的子目录;C:\test下有getpath.py,sub目录下有sub_path.py,且getpath.py调用了sub_path.py。当我们在C:\test下执行getpath.py时,若在sub_path.py中使用sys.path[0],得到的将是getpath.py所在的目录“C:\test”,因为Python虚拟机是从getpath.py开始执行的。若需获取sub_path.py自身的所在目录,应采用如下方式:
os.path.split(os.path.realpath(__file__))[0]
[Get Code]
其中__file__虽表示所在.py文件的完整路径,但该变量有时返回相对路径,有时返回绝对路径,因此需结合os.path.realpath()函数进行处理。即在上述示例中,os.path.realpath(__file__)输出“C:\test\sub\sub_path.py”,而os.path.split(os.path.realpath(__file__))[0]输出才是“C:\test\sub”。
(Edit Section ↓)
实例解析
实例解析
综上所述,举例说明os.getcwd()、sys.path[0](或sys.argv[0])与__file__的区别如下:
假设目录结构如下:
C:\test
|
[dir] getpath
|
[file] path.py
[dir] sub
|
[file] sub_path.py
随后在C:\test目录下执行python getpath/path.py,此时sub_path.py中各用法对应的值分别为:
• os.getcwd() 返回 “C:\test”,表示起始执行目录 • sys.path[0] 或 sys.argv[0] 返回 “C:\test\getpath”,表示被初始执行的脚本所在目录 • os.path.split(os.path.realpath(__file__))[0] 返回 “C:\test\getpath\sub”,表示__file__所在文件sub_path.py的所在目录
获取父目录与绝对路径
PS:以下介绍Python3获取当前目录及上级目录的方法
d = path.dirname(__file__) #返回当前文件所在的目录
# __file__ 为当前文件
获取某路径的父级目录:
parent_path = os.path.dirname(d) #获得d所在的目录,即d的父级目录
parent_path = os.path.dirname(parent_path) ##获得parent_path所在的目录即parent_path的父级目录
获取规范的绝对路径:
abspath = path.abspath(d) #返回d所在目录规范的绝对路
总结
以上所述是小编给大家介绍的python3获取当前目录的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













