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中关于日期时间处理的问答集锦
Mar 08 Python
使用PyCharm配合部署Python的Django框架的配置纪实
Nov 19 Python
Python 处理数据的实例详解
Aug 10 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
Feb 24 Python
Python爬虫实现(伪)球迷速成
Jun 10 Python
python绘制立方体的方法
Jul 02 Python
python机器学习包mlxtend的安装和配置详解
Aug 21 Python
python分布式计算dispy的使用详解
Dec 22 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
Jan 15 Python
Python定时从Mysql提取数据存入Redis的实现
May 03 Python
Python使用正则表达式实现爬虫数据抽取
Aug 17 Python
Django执行源生mysql语句实现过程解析
Nov 12 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使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
innerhtml用法 innertext用法 以及innerHTML与innertext的区别
2009/10/26 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
深入学习JavaScript对象
2015/10/13 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
2015/12/04 Javascript
JS全局变量和局部变量最新解析
2016/06/24 Javascript
深入理解JS实现快速排序和去重
2016/10/17 Javascript
JS实现的简易拖放效果示例
2016/12/29 Javascript
Bootstrap table右键功能实现方法
2017/02/20 Javascript
Vue2.0权限树组件实现代码
2017/08/29 Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
2017/10/26 Javascript
深入浅析Vue中的slots/scoped slots
2018/04/03 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
2018/12/03 Javascript
深入理解react 组件类型及使用场景
2019/03/07 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
JavaScript编写开发动态时钟
2020/07/29 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
python实现ID3决策树算法
2018/08/29 Python
Django框架的中的setting.py文件说明详解
2018/10/15 Python
python实现微信自动回复机器人功能
2019/07/11 Python
python脚本实现mp4中的音频提取并保存在原目录
2020/02/27 Python
浅析Python __name__ 是什么
2020/07/07 Python
python 装饰器的基本使用
2021/01/13 Python
HTML5对比HTML4的主要改变和改进总结
2016/05/27 HTML / CSS
Omio法国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/13 全球购物
英国网上购买门:Direct Doors
2018/06/07 全球购物
简述安装Slackware Linux系统的过程
2012/05/08 面试题
千元咖啡店的创业计划书范文
2013/12/29 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
Java spring单点登录系统
2021/09/04 Java/Android
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android
在Centos 8.0中安装Redis服务器的教程详解
2022/03/21 Redis