Python获取脚本所在目录的正确方法


Posted in Python onApril 15, 2014

1.以前的方法

如果是要获得程序运行的当前目录所在位置,那么可以使用os模块的os.getcwd()函数。

如果是要获得当前执行的脚本的所在目录位置,那么需要使用sys模块的sys.path[0]变量或者sys.argv[0]来获得。实际上sys.path是Python会去寻找模块的搜索路径列表,sys.path[0]和sys.argv[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]的输出还会变化:
如果把依赖库用默认的方式打包为zip文件,那么sys.path[0]会输出“C:\test\getpath\libarary.zip”;
如果在setup.py里面指定zipfile=None参数,依赖库就会被打包到exe文件里面,那么sys.path[0]会输出“C:\test\getpath\getpath.exe”。

2.正确的方法

但以上这些其实都不是脚本文件所在目录的位置。
比如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]

其中__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”。

3.实例说明

总之,举例来讲,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的所在目录
Python 相关文章推荐
12步教你理解Python装饰器
Feb 25 Python
Python+django实现简单的文件上传
Aug 17 Python
Python闭包的两个注意事项(推荐)
Mar 20 Python
使用Python进行QQ批量登录的实例代码
Jun 11 Python
解决pandas .to_excel不覆盖已有sheet的问题
Dec 10 Python
Python面向对象程序设计之类的定义与继承简单示例
Mar 18 Python
Python后台开发Django的教程详解(启动)
Apr 08 Python
python+selenium实现自动化百度搜索关键词
Jun 03 Python
Python的互斥锁与信号量详解
Sep 12 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
Apr 30 Python
Pycharm新手使用教程(图文详解)
Sep 17 Python
在python中读取和写入CSV文件详情
Jun 28 Python
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
Apr 15 #Python
python中使用sys模板和logging模块获取行号和函数名的方法
Apr 15 #Python
python 动态获取当前运行的类名和函数名的方法
Apr 15 #Python
python使用百度翻译进行中翻英示例
Apr 14 #Python
python使用xauth方式登录饭否网然后发消息
Apr 11 #Python
python判断、获取一张图片主色调的2个实例
Apr 10 #Python
Python使用新浪微博API发送微博的例子
Apr 10 #Python
You might like
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
重置版游戏视频
2020/04/09 魔兽争霸
在apache下限制每个虚拟主机的并发数!!!!
2006/10/09 PHP
PHP MYSQL乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
ThinkPHP使用心得分享-上传类UploadFile的使用
2014/05/15 PHP
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
基于jquery的拖动布局插件
2011/11/25 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
微信小程序如何获取用户信息
2018/01/26 Javascript
浅谈webpack+react多页面开发终极架构
2018/11/11 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
Node.js中package.json中库的版本号(~和^)
2019/04/02 Javascript
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
Python实现二分法算法实例
2015/02/02 Python
分析python请求数据
2018/08/19 Python
Python可迭代对象操作示例
2019/05/07 Python
Python 获取项目根路径的代码
2019/09/27 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
python 错误处理 assert详解
2020/04/20 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
Stella McCartney官网:成衣、包袋、香水、内衣、童装及Adidas系列
2018/12/20 全球购物
工程类专业自荐信范文
2014/03/09 职场文书
小学生期末评语
2014/04/21 职场文书
学校法制宣传月活动总结
2014/07/03 职场文书
2014年教师节寄语
2014/08/11 职场文书
春游踏青活动方案
2014/08/14 职场文书
寻找最美家庭活动方案
2014/08/20 职场文书
大学生职业生涯规划大赛作品(精品)
2014/09/17 职场文书
和谐拯救危机观后感
2015/06/15 职场文书
广播体操比赛主持词
2015/06/29 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书
Django drf请求模块源码解析
2021/06/08 Python
Python实现列表拼接和去重的三种方式
2021/07/02 Python
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL