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中的getattr函数 hasattr函数
Jun 14 Python
python实现简单中文词频统计示例
Nov 08 Python
python selenium UI自动化解决验证码的4种方法
Jan 05 Python
10个Python小技巧你值得拥有
Sep 29 Python
详解10个可以快速用Python进行数据分析的小技巧
Jun 24 Python
如何通过雪花算法用Python实现一个简单的发号器
Jul 03 Python
Django多数据库的实现过程详解
Aug 01 Python
在django admin详情表单显示中添加自定义控件的实现
Mar 11 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
May 20 Python
keras slice layer 层实现方式
Jun 11 Python
python能做哪些生活有趣的事情
Sep 09 Python
彻底解决Python包下载慢问题
Nov 15 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中上传大体积文件时需要的设置
2006/10/09 PHP
php-fpm配置详解
2014/02/12 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
php微信公众平台开发(一) 配置接口
2016/12/06 PHP
基于php实现的验证码小程序
2016/12/13 PHP
javascript 新浪背投广告实现代码
2009/07/07 Javascript
基于JQuery的多标签实现代码
2012/09/19 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
微信js-sdk上传与下载图片接口用法示例
2016/10/12 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
nodejs个人博客开发第三步 载入页面
2017/04/12 NodeJs
react-router JS 控制路由跳转实例
2017/06/15 Javascript
一些手写JavaScript常用的函数汇总
2019/04/16 Javascript
微信小程序实现卡片左右滑动效果的示例代码
2019/05/01 Javascript
vue 实现搜索的结果页面支持全选与取消全选功能
2019/05/10 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
JavaScript多种图形实现代码实例
2020/06/28 Javascript
[03:36]2015国际邀请赛第二日现场精彩集锦
2015/08/06 DOTA
python socket网络编程步骤详解(socket套接字使用)
2013/12/06 Python
python入门之语句(if语句、while语句、for语句)
2015/01/19 Python
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
Centos下实现安装Python3.6和Python2共存
2018/08/15 Python
python字典改变value值方法总结
2019/06/21 Python
使用keras实现Precise, Recall, F1-socre方式
2020/06/15 Python
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
几个Linux面试题笔试题
2012/12/01 面试题
市场营销专业推荐信
2013/11/03 职场文书
应届生自我鉴定
2013/12/11 职场文书
医院总经理岗位职责
2014/02/04 职场文书
2014年党务公开实施方案
2014/02/27 职场文书
Python 中 Shutil 模块详情
2021/11/11 Python
解决persistence.xml配置文件修改存放路径的问题
2022/02/24 Java/Android
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js