【转】Python中获取路径os.getcwd()和os.path.dirname(os.path.realpath(__file__))的区别和对比

本文对比分析了Python中os.getcwd()与os.path.dirname(os.path.realpath(__file__))两种获取当前路径的方法,通过具体实验揭示了两者的本质区别。前者获取的是运行脚本的目录,后者则指向调用模块的路径。

转载一篇博文,记录一下两种当前路径获取方式的异同
https://blog.youkuaiyun.com/cyjs1988/article/details/77839238/

原博主目前用的是Python的os.getcwd()方法,但我一位朋友给出的是os.path.dirname(os.path.realpath(file))

那么,这两种方式到底有什么本质区别?

原博主通过具体的实验来进行解释。

先给出2个目录的结构:

(1)PycharmProjects/pythonLearn/dir/dir2/getRootPath.py

(2)PycharmProjects/pythonLearn/getPath.py

【1】那我们先看看第一个PycharmProjects/pythonLearn/dir/dir2/getRootPath.py,如下代码:

import os  
  
def getCurPath1():  
    cur_path = os.path.dirname(os.path.realpath(__file__))  
    return cur_path  
  
def getCurPath2():  
    cur_path = os.getcwd()  
    return cur_path  
  
  
print('func1----'+getCurPath1())  
print('func2----'+getCurPath2())  

我们直接执行该脚本得到的结果如下:

func1----C:\Users\Administrator\PycharmProjects\PythonLearn\dir\dir2
func2----C:\Users\Administrator\PycharmProjects\PythonLearn\dir\dir2

并未看出本质区别,获取的都是当前脚本所在的dir2目录。

【2】那我们再看看第二个PycharmProjects/pythonLearn/getPath.py,如下代码:

现在,我们在里面我们引入了PycharmProjects/pythonLearn/dir/dir2/目录下的getRootPath.py模块。

from dir.dir2 import getRootPath  
  
path1 = getRootPath.getCurPath1()  
path2 = getRootPath.getCurPath2()  

直接执行getPath.py文件获取的结果如下:

func1----C:\Users\Administrator\PycharmProjects\PythonLearn\dir\dir2
func2----C:\Users\Administrator\PycharmProjects\PythonLearn

这个时候,你有没有发现有什么不同,这里的func1就是os.path.dirname(os.path.realname(file))获取的__file__所在脚本的路径,也就是getRootPath.py的路径。

而os.getcwd()获取的当前最外层调用的脚本路径,即getPath所在的目录也可描述为起始的执行目录,A调用B,起始的是A,那么获取的就是A所在的目录路径。

方法补充说明:
os.path.dirname():去掉脚本的文件名,返回目录。
os.path.dirname(os,path.realname(file)):指的是,获得你刚才所引用的模块 所在的绝对路径,__file__为内置属性。

<think>好的,我现在需要解释Pythonos.path.dirname(__file__)的作用。用户已经提供了几个引用资料,我得仔细看看这些资料里的信息,然后整理出一个清晰的回答。 首先,根据引用[3],os.path.dirname(__file__)返回的是当前.py文件所在的目录,而os.path.abspath(__file__)返回的是文件的绝对路径。引用[5]提到,os.path.realpath(__file__)会得到脚本的绝对路径,然后用dirname去掉文件名,得到目录。这说明dirname的作用是去掉路径中的文件名部分,返回所在目录。 引用[2]比较了os.getcwd()os.path.dirname(os.path.realpath(__file__))区别。用户的朋友用的是后者,而用户自己用的是前者。这里可能需要解释getcwd()返回的是当前工作目录,而dirname(__file__)返回的是脚本所在的目录,这两者可能不同,尤其是当脚本被其他目录调用时。 接下来,我需要结合这些信息,说明__file__变量的含义。根据引用[4]中的例子,当使用os.path.dirname(__file__)时,如果__file__是相对路径,返回的也是相对路径的目录部分。而加上realpath或abspath可以确保得到绝对路径,这样更可靠。 还要注意引用[1]中的示例代码,直接打印os.path.dirname(__file__)的结果,可能得到空字符串或者相对路径,这取决于脚本的执行方式。因此,通常建议结合abspathrealpath获取绝对路径,如引用[3][5]所示。 总结起来,需要分步骤说明: 1. __file__变量代表当前脚本的文件名(包括路径)。 2. os.path.dirname()函数的作用是去掉文件名,返回目录部分。 3. 单独使用dirname(__file__)可能得到相对路径,结合abspathrealpath可以为绝对路径。 4. 对比getcwd()dirname(realpath(__file__))区别,强调后者更准确。 同时,用户提供的引用中多次提到这些函数的组合使用,比如os.path.dirname(os.path.realpath(__file__)),需要解释每一步的作用,并说明为什么这样用更可靠。 最后,生成的相关问题需要覆盖常见的疑问,比如相对路径绝对路径区别,如何获取当前脚本的绝对路径,以及其他方法如getcwd()对比等。</think>### Python中`os.path.dirname(__file__)`的功能解释 在Python中,`os.path.dirname(__file__)`用于获取当前脚本的**目录路径**。具体作用可分为以下几步分析: 1. **`__file__`变量的含义** `__file__`是Python内置变量,表示当前执行脚本的文件名(含路径)。例如,若脚本路径为`/home/user/project/app.py`,则`__file__`的值为`"app.py"`(相对路径)或完整绝对路径,具体取决于调用方式[^3][^5]。 2. **`os.path.dirname()`的作用** 该函数用于提取路径中的目录部分。例如: - 输入路径为`/home/user/project/app.py` → 输出为`/home/user/project` - 输入路径为`app.py` → 输出为空字符串`''`[^3][^4]。 3. **组合使用示例** - **`os.path.dirname(__file__)`**:直接获取当前脚本的目录路径(可能是相对路径或绝对路径)[^3]。 - **`os.path.dirname(os.path.realpath(__file__))`**: 1. `os.path.realpath(__file__)`:解析符号链接并返回绝对路径(如`/home/user/project/app.py`)。 2. `dirname`提取其目录部分(如`/home/user/project`)[^2]。 此组合方式更可靠,确保路径为绝对路径。 4. **`os.getcwd()`的区别** - `os.getcwd()`返回当前**工作目录**(脚本被调用时的目录),而`os.path.dirname(__file__)`返回脚本**实际存储的目录**。 - 例如:若在`/tmp`目录下执行`python /home/user/project/app.py`,则`getcwd()`返回`/tmp`,而`dirname(__file__)`返回`/home/user/project`[^2]。 #### 典型应用场景 ```python import os # 获取当前脚本的绝对路径目录 script_dir = os.path.dirname(os.path.abspath(__file__)) print(f"脚本目录:{script_dir}") # 组合路径(避免硬编码) config_path = os.path.join(script_dir, "config.json") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值