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中os和shutil模块实用方法集锦
May 13 Python
Python操作使用MySQL数据库的实例代码
May 25 Python
使用Python实现微信提醒备忘录功能
Dec 04 Python
解决Python中list里的中文输出到html模板里的问题
Dec 17 Python
对Python中创建进程的两种方式以及进程池详解
Jan 14 Python
Pytorch Tensor 输出为txt和mat格式方式
Jan 03 Python
Matlab中plot基本用法的具体使用
Jul 17 Python
PyCharm+PyQt5+QtDesigner配置详解
Aug 12 Python
Python实现随机爬山算法
Jan 29 Python
Python3爬虫ChromeDriver的安装实例
Feb 06 Python
python基础之while循环语句的使用
Apr 20 Python
PYTHON基于Pyecharts绘制常见的直角坐标系图表
Apr 28 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版)
2012/08/21 PHP
PHP JS Ip地址及域名格式检测代码
2013/09/27 PHP
php与java通过socket通信的实现代码
2013/10/21 PHP
laravel框架模型、视图与控制器简单操作示例
2019/10/10 PHP
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
关于img的href和src取变量及赋值的方法
2014/04/28 Javascript
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
将jquery.qqFace.js表情转换成微信的字符码
2017/12/01 jQuery
vue实现a标签点击高亮方法
2018/03/17 Javascript
JavaScript常见JSON操作实例分析
2018/08/08 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
vue实现codemirror代码编辑器中的SQL代码格式化功能
2019/08/27 Javascript
基于vuex实现购物车功能
2021/01/10 Vue.js
JS实现纸牌发牌动画
2021/01/19 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
[01:19:34]2014 DOTA2国际邀请赛中国区预选赛 New Element VS Dream time
2014/05/22 DOTA
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
[49:20]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
Python使用MONGODB入门实例
2015/05/11 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
Python numpy 点数组去重的实例
2018/04/18 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
python实现趣味图片字符化
2019/04/30 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
CSS3 实现图形下落动画效果
2020/11/13 HTML / CSS
施华洛世奇韩国官网:SWAROVSKI韩国
2018/06/05 全球购物
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
文明工地标语
2014/06/16 职场文书
关于十八大的演讲稿
2014/09/15 职场文书
医院营销工作计划
2015/01/16 职场文书
生日祝酒词大全
2015/08/10 职场文书