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生成器实现微线程编程的教程
Apr 13 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
Jun 16 Python
Python中functools模块函数解析
Mar 12 Python
分分钟入门python语言
Mar 20 Python
Python运行不显示DOS窗口的解决方法
Oct 22 Python
python判断完全平方数的方法
Nov 13 Python
自学python的建议和周期预算
Jan 30 Python
对python tkinter窗口弹出置顶的方法详解
Jun 14 Python
PyCharm永久激活方式(推荐)
Sep 22 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
Jun 10 Python
python 进制转换 int、bin、oct、hex的原理
Jan 13 Python
Python中字符串对象语法分享
Feb 24 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/10/09 PHP
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
基于jquery实现控制经纬度显示地图与卫星
2013/05/20 Javascript
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
javascript动态添加删除tabs标签的方法
2015/07/06 Javascript
JavaScript对象数组如何按指定属性和排序方向进行排序
2016/06/15 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
清除输入框内的空格
2016/12/21 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
从vue源码看props的用法
2019/01/09 Javascript
Node对CommonJS的模块规范
2019/11/06 Javascript
JavaScript中EventBus实现对象之间通信
2020/10/18 Javascript
[02:12]打造更好的电竞完美世界:完美盛典回顾篇
2018/12/19 DOTA
Python语法快速入门指南
2015/10/12 Python
Python for Informatics 第11章之正则表达式(四)
2016/04/21 Python
python字典多键值及重复键值的使用方法(详解)
2016/10/31 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
使用pycharm生成代码模板的实例
2018/05/23 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
简单分析python的类变量、实例变量
2019/08/23 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
美国运动鞋类和服装零售连锁店:Shoe Palace
2019/08/13 全球购物
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
房产委托公证书样本
2014/04/04 职场文书
三八红旗集体先进事迹材料
2014/05/22 职场文书
中学生思想品德评语
2014/12/31 职场文书
实习科室评语
2015/01/04 职场文书
2015年党风廉政建设目标责任书
2015/05/08 职场文书
nginx proxy_cache 缓存配置详解
2021/03/31 Servers
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL
CSS使用Flex和Grid布局实现3D骰子
2022/08/05 HTML / CSS