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 相关文章推荐
python3生成随机数实例
Oct 20 Python
python对url格式解析的方法
May 13 Python
Python根据区号生成手机号码的方法
Jul 08 Python
Windows下搭建python开发环境详细步骤
Jul 20 Python
详解Python中open()函数指定文件打开方式的用法
Jun 04 Python
python模拟表单提交登录图书馆
Apr 27 Python
python 基本数据类型占用内存空间大小的实例
Jun 12 Python
用python一行代码得到数组中某个元素的个数方法
Jan 28 Python
Python寻找路径和查找文件路径的示例
Jul 10 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
Aug 19 Python
python中web框架的自定义创建
Sep 08 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
Aug 31 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 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
用JavaScript实现动画效果的方法
2013/07/20 Javascript
如何在node的express中使用socket.io
2014/12/15 Javascript
jquery实现横向图片轮播特效代码分享
2015/11/19 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
2017/01/10 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
11行JS代码制作二维码生成功能
2018/03/09 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
微信小程序实现侧边栏分类
2019/10/21 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
js实现淘宝首页的banner栏效果
2019/11/26 Javascript
浅谈vue websocket nodeJS 进行实时通信踩到的坑
2020/09/22 NodeJs
python通过wxPython打开一个音频文件并播放的方法
2015/03/25 Python
Python实例一个类背后发生了什么
2016/02/09 Python
python网络编程调用recv函数完整接收数据的三种方法
2017/03/31 Python
Python完成毫秒级抢淘宝大单功能
2019/06/06 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
python flask搭建web应用教程
2019/11/19 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
2020/01/14 Python
Python计算指定日期是今年的第几天(三种方法)
2020/03/26 Python
Python获取android设备cpu和内存占用情况
2020/11/15 Python
俄罗斯在线水暖商店:Perfecto.ru
2019/10/25 全球购物
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
如何保障Web服务器安全
2014/05/05 面试题
刊首寄语大全
2014/04/11 职场文书
企业口号大全
2014/06/12 职场文书
安全目标责任书
2014/07/22 职场文书
普通话演讲稿
2014/09/03 职场文书
车辆转让协议书
2014/09/24 职场文书
代领学位证书毕业证书委托书
2014/09/30 职场文书
小学音乐教师个人工作总结
2015/02/05 职场文书
2015国庆节放假通知范文
2015/07/30 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
2019军训心得体会
2019/06/27 职场文书