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 相关文章推荐
python类中super()和__init__()的区别
Oct 18 Python
Python实现计算两个时间之间相差天数的方法
May 10 Python
Python 调用Java实例详解
Jun 02 Python
浅谈用Python实现一个大数据搜索引擎
Nov 28 Python
Python实现将照片变成卡通图片的方法【基于opencv】
Jan 17 Python
Python输入二维数组方法
Apr 13 Python
如何用Python破解wifi密码过程详解
Jul 12 Python
python lambda表达式在sort函数中的使用详解
Aug 28 Python
python模拟实现分发扑克牌
Apr 22 Python
python接入支付宝的实例操作
Jul 20 Python
Django rest framework如何自定义用户表
Jun 09 Python
Python+Matplotlib+LaTeX玩转数学公式
Feb 24 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
PHP面向对象的使用教程 简单数据库连接
2006/11/25 PHP
php中mysql模块部分功能的简单封装
2011/09/30 PHP
php错误、异常处理机制(补充)
2012/05/07 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
2016/09/11 PHP
php中bind_param()函数用法分析
2017/03/28 PHP
Prototype ObjectRange对象学习
2009/07/19 Javascript
Mootools 1.2教程 Tooltips
2009/09/15 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
javascript使用onclick事件改变选中行的颜色
2013/12/30 Javascript
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
实现一个完整的Node.js RESTful API的示例
2017/09/29 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
2018/11/14 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
[00:33]2018DOTA2亚洲邀请赛TNC出场
2018/04/04 DOTA
Python os模块介绍
2014/11/30 Python
python数据封装json格式数据
2018/03/04 Python
TensorFlow实现MLP多层感知机模型
2018/03/09 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
python实现机器学习之多元线性回归
2018/09/06 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
对pandas的行列名更改与数据选择详解
2018/11/12 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
python爬虫爬取微博评论案例详解
2019/03/27 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
python模拟实现斗地主发牌
2020/01/07 Python
python 下载m3u8视频的示例代码
2020/11/11 Python
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
如何理解委托
2012/01/06 面试题
采购主管岗位职责
2014/02/01 职场文书
飘柔洗发水广告词
2014/03/14 职场文书
服装仓管员岗位职责
2014/06/17 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书