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中logging库的使用总结
Oct 18 Python
Python3 实现随机生成一组不重复数并按行写入文件
Apr 09 Python
pandas系列之DataFrame 行列数据筛选实例
Apr 12 Python
Sanic框架蓝图用法实例分析
Jul 17 Python
树莓派3 搭建 django 服务器的实例
Aug 29 Python
使用python实现画AR模型时序图
Nov 20 Python
Python文本处理简单易懂方法解析
Dec 19 Python
基于Python的一个自动录入表格的小程序
Aug 05 Python
python实现网页录音效果
Oct 26 Python
Python通过yagmail实现发送邮件代码解析
Oct 27 Python
python 如何用terminal输入参数
May 25 Python
Python&Matlab实现樱花的绘制
Apr 07 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
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
javascript中的缓动效果实现程序
2012/12/29 Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
2013/01/29 Javascript
JS特权方法定义作用以及与公有方法的区别
2013/03/18 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
使用apply方法实现javascript中的对象继承
2013/12/16 Javascript
jquery实现弹出层遮罩效果的简单实例
2014/03/03 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
2015/06/05 Javascript
总结JavaScript中布尔操作符||与&&的使用技巧
2015/11/17 Javascript
js实现图片上传并正常显示
2015/12/19 Javascript
Bootstrap树形控件使用方法详解
2016/01/27 Javascript
js实现简单的省市县三级联动效果实例
2016/02/18 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
2016/06/15 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
vue的全局提示框组件实例代码
2018/02/26 Javascript
js循环map 获取所有的key和value的实现代码(json)
2018/05/09 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
跟老齐学Python之通过Python连接数据库
2014/10/28 Python
python插入数据到列表的方法
2015/04/30 Python
Windows下python2.7.8安装图文教程
2016/05/26 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
pandas分区间,算频率的实例
2019/07/04 Python
python3列表删除大量重复元素remove()方法的问题详解
2021/01/04 Python
ASOS比利时:英国线上零售商及自有品牌
2018/07/29 全球购物
Farfetch中文官网:奢侈品牌时尚购物平台
2020/03/15 全球购物
机械制造与自动化应届生求职信
2013/11/16 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
本科生求职信
2014/06/17 职场文书
公司户外活动总结
2014/07/04 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
python神经网络编程之手写数字识别
2021/05/08 Python