专栏首页python3python 获取脚本所在目录的正确方法

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:\testsys.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.pysub目录下有 sub_path.pygetpath.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
|-getpath
    |-path.py
    |-sub
        |-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的所在目录

参考这里

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • django中url路由配置及渲染方式

      今天我们学习如何配置url、如何传参、如何命名、以及渲染的方式,内容大致有以下几个方面。

    py3study
  • python sys模块详解

      sys.argv           命令行参数List,第一个元素是程序本身路径 sys.modules.keys() 返回所有已经导入的模块列表 ...

    py3study
  • 在Ubuntu中实现python按tab

        刚学习python,其实一切都很好接受,因为有过C语言的基础,感觉一切都来得那么自然,python极其精简的语法,让我真心是爱上这种语言!相信往后pyt...

    py3study
  • django中url路由配置及渲染方式

      今天我们学习如何配置url、如何传参、如何命名、以及渲染的方式,内容大致有以下几个方面。

    py3study
  • 英特尔推出颠覆性架构:3D堆叠芯片,10nm制程明年上市

    此外,英特尔还在本周三的活动中推出了 10 纳米制程架构「Sunny Cove」,它将成为 Skylake 的继承者。由于新的指令集出现,处理器单线程和多线程的...

    机器之心
  • 你知道有几种方式来判断JS的数据类型吗?

    因为JavaScript是一门弱引用类型的语言,所以在开发过程中我们常常会遇到 “我定义的这个变量是什么数据类型?”这种类似的问题,所以今天我们来看看在JS中一...

    用户2802329
  • 在Volumio中使用命令行网易云音乐

    美丽应用
  • 给你的SSH加一道防火墙,如何用Kryptonite进行SSH操作

    Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实...

    所有的酒都不如你
  • 由Spring应用的瑕疵谈谈DDD的概念与应用(一)

    多数有经验的程序开发者都应该听说过DDD,并且尝试过将其应用在自己的项目中。不知你是否遇到过这样的场景:你创建了一个资源库(Repository),但一段时间之...

    aoho求索
  • spss C# 二次开发 学习笔记(二)——Spss以及统计术语解释(IT人眼中的统计术语)

    针对客户需求,需要对一些数据做统计分析。统计分析的第一步,即为数据查询,查找出要统计分析的数据。 查询得出的是一个行列表格的结果集,行、列、表格等这些IT的数据...

    用户1637609

扫码关注云+社区

领取腾讯云代金券