os.getcwd() 和 os.path.dirname(__file__) 之间的区别

Mor*_*roß 9 python python-3.x

在之前的项目中,我使用了以下两行的第一个版本。现在我找到了getcwd()我认为这将是更短的替代方案。

print(os.path.dirname(__file__))  # D:/Personal_Software/my_project
print(os.getcwd())  # D:\Personal_Software\my_project
Run Code Online (Sandbox Code Playgroud)

我已经读过这篇文章,但我很好奇的是“/”与“\”的使用。如果相关的话,我正在使用 Windows 10。

ike*_*ami 5

  • __file__是提供给 Python 的文件名,与提供的完全一样。
  • os.path.dirname(__file__)通常是脚​​本所在的目录。(但并非总是如此,正如您将在下面看到的那样。)
  • os.path.dirname(os.path.realpath(__file__))是脚本所在的目录。
  • os.getcwd()是当前目录。

当前目录与脚本所在位置无关。它是用于解析相对路径的每个进程路径。

/tmp/ikegami/a.py:

#!/usr/bin/python3

import os

print(__file__)
print(os.path.dirname(__file__))
print(os.path.dirname(os.path.realpath(__file__)))
print(os.getcwd())
Run Code Online (Sandbox Code Playgroud)
[~]$ bin/a                # A symlink to /tmp/ikegami/a.py
bin/a                     # The path provided to python3.
bin                       # NOT the directory in which the script is located.
/tmp/ikegami              # The directory in which the script is located.
/home/ikegami             # The current directory (~ = /home/ikegami)

[~]$ /tmp/ikegami/a.py
/tmp/ikegami/a.py         # The path provided to python3.
/tmp/ikegami              # The parent of the path provided to python3.
/tmp/ikegami              # The directory in which the script is located.
/home/ikegami             # The current directory (~ = /home/ikegami)

[~]$ cd /tmp/ikegami

[/tmp/ikegami]$ ./a.py
./a.py                    # The path provided to python3.
.                         # The parent of the path provided to python3.
/tmp/ikegami              # The directory in which the script is located.
/tmp/ikegami              # The current directory
Run Code Online (Sandbox Code Playgroud)

(这些测试是在 Linux 机器上运行的,因为我没有在这台 Windows 机器上安装 python。您将在 Windows 上得到类似的结果。)


我很好奇的是“/”与“\”的使用。

Windows 始终接受\/作为目录分隔符。[1] [2],在此之前 DOS 也是如此。[3]这些是等效的。\是规范分隔符(为了一致性而首选的分隔符),但/效果也一样。

您的程序似乎是使用 启动的python3 D:/Personal_Software/my_project/file.py__file__包含提供给 Python 的确切路径,并dirname(__file__)简单地删除最后一位。

os.getcwd()另一方面,从操作系统接收当前目录,并且操作系统可能返回当前目录的规范形式。


  1. 您甚至可以用于//UNC 路径 ( //server/share) 和类似路径 ( //?/...//./...等)。

  2. 与已经做出的声明相反,这是系统调用的情况(即 Win32 API),这是资源管理器中的情况(“我的电脑”、“文件资源管理器”、“另存为”对话框等),这是这是 Power Shell 中的情况(例如dir "c:/bin"c:/bin/myprog),这是 Windows 控制台中的情况(例如c:/bin/myprog)。

    注意:某些特定的 Windows 控制台命令(例如dir)需要将路径放在/引号中(例如dir "c:/"),因为/向它们发出选项开始的信号。

  3. 好吧,既然目录是在 DOS 2.0 中引入的。


Gri*_*mar 3

尽管您无法从单个脚本中看出差异,但还是有差异的。

__file__是加载的模块或脚本的完整文件名,因此获取它的父目录os.path.dirname(__file__)可以获取脚本所在的目录。

注意:在 Linux(和类似的操作系统)上,这样的文件名可以是指向可能驻留在其他地方的实际文件的符号链接。如果需要,您可以使用os.path.realpath()任何此类链接来解析,但通常也可以等效地使用符号链接。在 Windows 上,这些不太常见,但类似地,您可以通过realpath().

os.getcwd()获取当前工作目录。如果您从脚本所在的目录(这很常见)启动脚本,则工作目录将与来自 的调用结果相同os.path.dirname(__file__)

但是,如果您从另一个目录启动脚本(即python d:\some\path\script.py),或者在脚本过程中更改工作目录(例如使用os.chdir()),则当前工作目录已更改,但脚本文件名的目录部分并未更改。

所以,这取决于你需要什么:

  • 需要脚本文件所在的目录吗?使用os.path.dirname(__file__)
  • 需要您的脚本当前运行的目录吗?使用os.getcwd()

/您会在一些结果和其他结果中看到\。遗憾的是,MS Windows 使用\分隔路径的各个部分(例如C:\Program Files\App\),而几乎所有其他操作系统都使用/(例如/home/user/script.py

Python 通常会自动转换这些路径,因此您也可以像C:/Program Files/AppWindows 上的 Python 一样使用路径,但为了安全起见,使用os.path.sep.

注意:如果您使用的是 Python 3,则最好使用pathlib'sPath而不是os.path。它会自动解析符号链接(尽管如果您愿意,您仍然可以解析该链接),并且还有其他很好的便利。