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 相关文章推荐
在 Django/Flask 开发服务器上使用 HTTPS
Jul 03 Python
用Python编写一个简单的FUSE文件系统的教程
Apr 02 Python
python Pandas 读取txt表格的实例
Apr 29 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
May 19 Python
python实现定时发送qq消息
Jan 18 Python
python 环境搭建 及python-3.4.4的下载和安装过程
Jul 20 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
python爬虫用mongodb的理由
Jul 28 Python
如何通过python计算圆周率PI
Nov 11 Python
通过python-pptx模块操作ppt文件的方法
Dec 26 Python
python3定位并识别图片验证码实现自动登录功能
Jan 29 Python
Python Matplotlib库实现画局部图
Nov 17 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实现mysql封装类示例
2014/05/07 PHP
php实现mysql数据库连接操作及用户管理
2015/11/08 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
ie6下png图片背景不透明的解决办法使用js实现
2013/01/11 Javascript
jquery 按钮状态效果 正常、移上、按下
2013/08/12 Javascript
网站404页面3秒后跳到首页的实例代码
2013/08/16 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
js 弹出新页面避免被浏览器、ad拦截的一种新方法
2014/04/30 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
javascript 闭包详解
2015/02/15 Javascript
详解自定义ajax支持跨域组件封装
2018/02/08 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
详解微信UnionID作用
2019/05/15 Javascript
JavaScript事件循环及宏任务微任务原理解析
2020/09/02 Javascript
[48:35]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 TNC vs Optic
2018/04/03 DOTA
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
Python迭代用法实例教程
2014/09/08 Python
Python 多线程不加锁分块读取文件的方法
2018/12/11 Python
python脚本执行CMD命令并返回结果的例子
2019/08/14 Python
Python+unittest+requests+excel实现接口自动化测试框架
2020/12/23 Python
纯CSS3实现Material Design效果
2017/03/09 HTML / CSS
实例讲解HTML5的meta标签的一些应用
2015/12/08 HTML / CSS
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
台湾专柜女包:KINAZ
2019/12/26 全球购物
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
Linux Interview Questions For software testers
2012/06/02 面试题
研发工程师的岗位职责
2013/11/18 职场文书
高中生期末评语
2014/01/28 职场文书
促销活动总结模板
2014/07/01 职场文书
工作失误检讨书范文
2015/01/26 职场文书
颐和园英文导游词
2015/01/30 职场文书
2016入党培训心得体会范文
2016/01/08 职场文书