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正则表达式re模块详解
Jun 25 Python
python字符串替换的2种方法
Nov 30 Python
复习Python中的字符串知识点
Apr 14 Python
python批量设置多个Excel文件页眉页脚的脚本
Mar 14 Python
利用Python代码实现数据可视化的5种方法详解
Mar 25 Python
python列表使用实现名字管理系统
Jan 30 Python
详解Python传入参数的几种方法
May 16 Python
Python实现微信小程序支付功能
Jul 25 Python
详解Django CAS 解决方案
Oct 30 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
Apr 21 Python
Python 如何在字符串中插入变量
Aug 01 Python
tensorflow中的梯度求解及梯度裁剪操作
May 26 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版本的几种方法小结
2008/03/25 PHP
解析PHP缓存函数的使用说明
2013/05/10 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
php简单实现单态设计模式的方法分析
2017/07/28 PHP
JavaScript XML操作 封装类
2009/07/01 Javascript
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
2011/04/06 Javascript
js播放wav文件(源码)
2013/04/22 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
Javascript字符串浏览器兼容问题分析
2014/12/01 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
2016/05/28 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
基于angularJS的表单验证指令介绍
2016/10/21 Javascript
基于javaScript的this指向总结
2017/07/22 Javascript
关于TypeScript中import JSON的正确姿势详解
2017/07/25 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
详解javascript中的Error对象
2019/04/25 Javascript
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
2019/07/23 Javascript
基于layPage插件实现两种分页方式浅析
2019/07/27 Javascript
[48:30]LGD vs infamous Supermajor小组赛D组 BO3 第一场 6.3
2018/06/04 DOTA
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
2018/10/31 Python
python生成以及打开json、csv和txt文件的实例
2018/11/16 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
python里运用私有属性和方法总结
2019/07/08 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
法律七进实施方案
2014/03/15 职场文书
施工单位安全责任书
2014/07/24 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
项目负责人岗位职责
2015/02/15 职场文书
幼儿园感恩节活动总结
2015/03/24 职场文书
宾馆前台接待岗位职责
2015/04/02 职场文书
Python利用zhdate模块实现农历日期处理
2022/03/31 Python