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 相关文章推荐
写了个监控nginx进程的Python脚本
May 10 Python
Python进程间通信用法实例
Jun 04 Python
Python获取邮件地址的方法
Jul 10 Python
举例讲解Python面相对象编程中对象的属性与类的方法
Jan 19 Python
Python 正则表达式入门(中级篇)
Dec 07 Python
python机器学习库常用汇总
Nov 15 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
Python除法之传统除法、Floor除法及真除法实例详解
May 23 Python
在pytorch中对非叶节点的变量计算梯度实例
Jan 10 Python
Python 写了个新型冠状病毒疫情传播模拟程序
Feb 14 Python
Python实现aes加密解密多种方法解析
May 15 Python
Python configparser模块常用方法解析
May 22 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
第五节--克隆
2006/11/16 PHP
php反弹shell实现代码
2009/04/22 PHP
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
2015/01/04 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
JavaScript 学习笔记一些小技巧
2010/03/28 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
基于JavaScript操作DOM常用的API小结
2015/12/01 Javascript
用JS中split方法实现彩色文字背景效果实例
2016/08/24 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
mpvue微信小程序多列选择器用法之省份城市选择的实现
2019/03/07 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
2020/01/06 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
Python中的条件判断语句基础学习教程
2016/02/07 Python
Python中int()函数的用法浅析
2017/10/17 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
2019/04/10 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
仿CSDN Blog返回页面顶部功能实现原理及代码
2013/06/30 HTML / CSS
html5简介_动力节点Java学院整理
2017/07/07 HTML / CSS
欧洲当代手工玻璃和瓷器的领先品牌:LSA International
2018/06/03 全球购物
速比涛英国官网:Speedo英国
2019/07/15 全球购物
如何实现一个自定义类的序列化
2012/05/22 面试题
软件测试面试题
2014/01/05 面试题
母婴店促销方案
2014/03/05 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
物业工程部经理岗位职责
2015/04/09 职场文书
村党组织公开承诺书
2015/04/30 职场文书
学校教学管理制度
2015/08/06 职场文书
学者《孟子》名人名言
2019/08/09 职场文书
Java中常用解析工具jackson及fastjson的使用
2021/06/28 Java/Android
Android实现获取短信验证码并自动填充
2023/05/21 Java/Android