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简易远程控制单线程版
Jun 20 Python
使用python语言,比较两个字符串是否相同的实例
Jun 29 Python
selenium python 实现基本自动化测试的示例代码
Feb 25 Python
python每天定时运行某程序代码
Aug 16 Python
Python队列、进程间通信、线程案例
Oct 25 Python
Pandas 缺失数据处理的实现
Nov 04 Python
python实现PCA降维的示例详解
Feb 24 Python
Python爬虫爬取微信朋友圈
Aug 06 Python
python如何停止递归
Sep 09 Python
Django debug为True时,css加载失败的解决方案
Apr 24 Python
Python中使用ipython的详细教程
Jun 22 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Apr 07 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
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
JS中不为人知的五种声明Number的方式简要概述
2013/02/22 Javascript
input输入框的自动匹配(原生代码)
2013/03/19 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
在jquery boxy中添加百度地图坐标拾取注意流程
2014/04/03 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
javascript下拉列表菜单的实现方法
2015/11/18 Javascript
简述jQuery ajax的执行顺序
2016/01/05 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
AngularJS教程之环境设置
2016/08/16 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
2018/12/20 Javascript
Vue实现的父组件向子组件传值功能示例
2019/01/19 Javascript
用Python写一个无界面的2048小游戏
2016/05/24 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
基于scrapy的redis安装和配置方法
2018/06/13 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
django url到views参数传递的实例
2019/07/19 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
深入学习python多线程与GIL
2019/08/26 Python
python UIAutomator2使用超详细教程
2021/02/19 Python
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
大学生实训报告总结
2014/11/05 职场文书
公务员年度考核评语
2014/12/31 职场文书
2015年感恩节演讲稿(优选篇)
2015/03/20 职场文书
学风建设主题班会
2015/08/17 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书
html form表单基础入门案例讲解
2021/07/21 HTML / CSS
电频谱管理的原则是什么
2022/02/18 无线电
Java使用HttpClient实现文件下载
2022/08/14 Java/Android