Python获取脚本所在目录的正确方法(转)
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基础之:Python中的模块
- python使用内置方法和修饰器方法获取类名、函数名
- python获取内网IP和外网IP的方法
- Python的Numpy库的ndarray对象常用构造方法及初始化方法
- 35 python - 函数使用注意事项
- python argparse参数配置详解
- Python Selenium设计模式及代码实现
- Python核心编程三大神兽——迭代器、生成器 、以及装饰器
- python+selenium 方法大全
- python实现K-Means算法
- Python 类的方法和静态方法
- 【Python】【异常】
- python:字符串常用方法及汇总
- python 面向对象(二)类的继承-多态-经典类和新式类-静态方法,类方法,实例方法-python中的下划线-常用魔术方法
- python数组基本用法实例解析
- python 文件操作常用方法
- python读取文件行号和内容的便捷方法
- 《树莓派Python编程入门与实战(第2版)》——2.5 小结
- 《Python面向对象编程指南》——1.6 在每个子类中实现__init()__方法
- 《Python面向对象编程指南》——2.3 __hash__()方法
- tensorflow保存模型和加载模型的方法(Python和Android)
- Python基础入门-异常处理
- pip install --user 使用方法和注意事项——python中安装module库到用户packages路径中
- Python实例---模拟微信网页登录(day4)
- 数学思想方法-python计算战(8)-机器视觉-二值化
- Python类的定义、方法和属性使用
- python六十五课——单元测试(一)
- python爬虫之多线程threading、多进程multiprocessing、协程aiohttp 批量下载图片
- Python每日一学 08——get()方法学习
- python @classmethod 类方法与 @staticmethod 静态方法 标准模块 abc 提供的 @abstractmethod 抽象方法
- python os.remove()方法
- [Python] count()方法