python如何获取脚本所在的目录_python获取当前执行脚本文件所在路径

最推荐使用pathlib.Path(__file__).resolve().parent获取脚本所在目录,它在Python 3.4+中提供面向对象、跨平台且可读性强的路径操作,能可靠解析绝对路径并返回父目录,优于传统的os.path.dirname(os.path.abspath(__file__))方法。

python如何获取脚本所在的目录_python获取当前执行脚本文件所在路径

在Python中获取脚本所在的目录,最直接且推荐的方式是结合

os.path

模块的

abspath

和

dirname

函数,即

os.path.dirname(os.path.abspath(__file__))

。对于更现代的Python版本,

pathlib

模块提供了更面向对象且可读性更好的解决方案,如

pathlib.Path(__file__).resolve().parent

。这两种方法都能可靠地定位到当前执行脚本的物理目录,无论脚本是如何被调用或导入的。

解决方案

要获取当前Python脚本文件所在的目录,我们可以依赖Python内置的

__file__

特殊变量,它包含了当前模块的路径。然而,

__file__

本身可能是一个相对路径,尤其是在脚本以某种特定方式被调用时。因此,我们需要对其进行处理以确保获得绝对路径,并最终提取出目录部分。

使用

os.path

模块 (Python 2.x 和 3.x 兼容):

这是最传统也是最常用的方法。

立即学习“Python免费学习笔记(深入)”;

import os# 1. 获取当前脚本文件的绝对路径# __file__ 变量包含了当前脚本的路径,但它可能是相对路径。# os.path.abspath() 会将其转换为绝对路径。script_path = os.path.abspath(__file__)# 2. 从绝对路径中提取目录部分# os.path.dirname() 用于获取给定路径的目录名。script_directory = os.path.dirname(script_path)print(f"脚本的完整路径: {script_path}")print(f"脚本所在的目录 (os.path): {script_directory}")# 简洁写法:# script_directory_concise = os.path.dirname(os.path.abspath(__file__))# print(f"脚本所在的目录 (os.path 简洁): {script_directory_concise}")

使用

pathlib

模块 (Python 3.4+ 推荐):

pathlib

提供了面向对象的文件系统路径操作,代码通常更简洁、可读性更强,并且处理跨平台路径分隔符更加优雅。

from pathlib import Path# 1. 创建一个Path对象表示当前脚本文件# Path(__file__) 创建一个Path对象。# .resolve() 方法类似于 os.path.abspath(),它会解析路径中的所有符号链接并返回绝对路径。script_path_obj = Path(__file__).resolve()# 2. 获取Path对象的父目录# .parent 属性直接返回Path对象的父目录。script_directory_obj = script_path_obj.parentprint(f"脚本的完整路径 (pathlib): {script_path_obj}")print(f"脚本所在的目录 (pathlib): {script_directory_obj}")# 如果需要字符串形式的路径:# script_directory_str = str(script_directory_obj)# print(f"脚本所在的目录 (pathlib 字符串): {script_directory_str}")

两种方法都能有效解决问题,

pathlib

在现代Python开发中越来越受欢迎,因为它将路径视为对象,提供了更直观的操作方式。

深入理解

__file__

:它在不同执行场景下的行为差异与潜在陷阱

__file__

这个内置变量,初看起来很简单,就是当前脚本的路径嘛。但实际用起来,它有时候确实会让人困惑,甚至掉进一些小坑。它不是一个简单的“当前文件绝对路径”的代名词,而更像是“当前模块被Python解释器加载时的源文件路径”。理解它在不同场景下的行为,对于我们正确获取脚本目录至关重要。

当你直接运行一个脚本,比如

python my_script.py

,

__file__

通常会包含

my_script.py

的路径。如果是在当前目录运行,它可能是相对路径

my_script.py

;如果从其他目录运行,比如

python /path/to/my_script.py

,那

__file__

就会是

/path/to/my_script.py

。

然而,当你的脚本作为模块被导入时,

__file__

的行为会有些许不同。它会指向被导入模块的

.py

文件路径,或者是其对应的

.pyc

(编译后的字节码)文件路径。这通常是绝对路径,但也并非总是如此。

更需要注意的是,在一些特殊场景下,

__file__

甚至可能不存在或不包含一个实际的文件路径。例如,在Python交互式解释器中,

__file__

是不存在的。如果你使用

exec()

函数执行一段代码,那段代码内部的

__file__

可能会是


或者一个临时的路径。

所以,我们不能盲目地相信

__file__

总是提供一个可直接使用的绝对路径。这就是为什么我们几乎总是需要用

os.path.abspath(__file__)

或者

Path(__file__).resolve()

来“净化”它。

abspath

会把任何相对路径转换为基于当前工作目录的绝对路径。而

resolve()

更进一步,它还会解析所有符号链接(软链接),确保你得到的是文件系统上真实的物理路径,这在处理部署或打包时尤其有用。

不加处理直接使用

os.path.dirname(__file__)

,如果

__file__

是相对路径,那么你得到的目录也会是相对于当前工作目录的相对路径,而不是脚本自身的物理目录,这往往不是我们想要的结果。所以,先

abspath

(或

resolve

)再

dirname

(或

.parent

)是一个非常必要的步骤,它能规避大部分

__file__

带来的不确定性。

Python路径处理新旧对比:

os.path

与

pathlib

的选择与优势

在Python中处理文件路径,我们有

os.path

这个老牌选手,也有

pathlib

这个后起之秀。它们都能完成任务,但风格和理念却大相径庭。选择哪一个,往往取决于你的项目需求、Python版本以及个人偏好。

os.path

模块自Python诞生之初就存在,它提供了一系列函数来操作字符串形式的路径。它的优点是兼容性极佳,几乎所有的Python环境都能用。但它的缺点也很明显:

字符串操作:所有路径都被视为字符串,这意味着你需要频繁地拼接字符串、拆分字符串,代码容易变得冗长且容易出错,比如忘记

os.path.join()

而直接用

+

号连接路径,导致跨平台问题。函数式:你需要调用各种函数来完成操作,比如

os.path.join()

、

os.path.dirname()

、

os.path.basename()

等,不够直观。可读性:当路径操作链条较长时,代码可读性会下降,例如

os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data', 'config.json')

。

而

pathlib

模块(Python 3.4+)则引入了面向对象的路径操作。它将路径视为对象,提供了更现代、更直观的API。它的优势在于:

面向对象:路径是一个

Path

对象,你可以直接在其上调用方法或使用属性,如

.parent

、

.name

、

.suffix

等。操作符重载:它重载了

/

操作符,使得路径拼接变得异常简洁和自然,例如

Path(__file__).parent / 'data' / 'config.json'

,这简直是艺术!链式调用:许多操作可以链式调用,使得代码更加紧凑和富有表达力。跨平台:

Path

对象自动处理不同操作系统之间的路径分隔符差异,你无需担心Windows的


和Linux/macOS的

/

。丰富的API:除了基本的路径操作,

pathlib

还提供了文件系统操作,如

.exists()

、

.is_file()

、

.mkdir()

、

.touch()

、

.read_text()

、

.write_bytes()

等,大大简化了文件操作。

对我来说,只要项目允许,我几乎总是倾向于使用

pathlib

。它的代码更优雅,更符合Python的“可读性”哲学。那种用

/

来拼接路径的感觉,简直是享受。当然,

os.path

仍然有它的用武之地,比如在一些需要与旧代码库高度兼容,或者处理一些非常底层的、需要字符串路径作为参数的系统调用时。但在日常的脚本开发和应用构建中,

pathlib

无疑是更现代、更强大的选择。它不仅让代码更清晰,也减少了因路径字符串操作而引入的潜在错误。

Python脚本跨平台路径获取:Windows、Linux和macOS的兼容性挑战与解决方案

编写Python脚本时,我们常常希望它能在不同的操作系统上无缝运行,而路径处理就是其中一个常见的跨平台挑战。Windows、Linux和macOS在文件系统路径的表示和行为上存在一些关键差异,如果处理不当,脚本可能在一个系统上运行良好,在另一个系统上却报错。

最明显的差异莫过于路径分隔符。Windows使用反斜杠


(例如

C:UsersAdminDocuments

),而Linux和macOS则使用正斜杠

/

(例如

/home/user/documents

)。幸运的是,Python的

os.path

和

pathlib

模块在设计时就考虑到了这一点。

os.path.join()

函数会根据当前操作系统的规则自动选择正确的分隔符。

pathlib

模块的

Path

对象及其

/

操作符也是开箱即用地支持跨平台分隔符。你只需写

Path('my_dir') / 'my_file.txt'

,它在Windows上会生成

my_dirmy_file.txt

,在Linux上则是

my_dir/my_file.txt

。

另一个需要注意的点是文件系统大小写敏感性。Linux和macOS(默认情况下)的文件系统是大小写敏感的,

MyFile.txt

和

MyFile.txt

是两个不同的文件。而Windows的文件系统通常是大小写不敏感的,

MyFile.txt

和

MyFile.txt

会被视为同一个文件。这意味着在Linux上,如果你尝试打开

MyFile.txt

但实际文件是

MyFile.txt

,就会遇到

FileNotFoundError

。在Python代码中,我们通常需要确保文件路径的大小写与实际文件系统中的一致,或者在查找文件时进行大小写不敏感的比较(如果业务逻辑允许)。

Windows特有的盘符也是一个差异。Linux和macOS的文件系统是统一的根目录

/

,而Windows有

C:

,

D:

等盘符。

os.path.abspath()

和

pathlib.Path().resolve()

在Windows上处理带有盘符的路径时,会正确地将其解析为完整的绝对路径,无需我们额外操心。

为了确保路径获取的跨平台兼容性,关键在于始终使用Python提供的抽象层:

获取脚本目录:正如前面所述,

os.path.dirname(os.path.abspath(__file__))

或

Path(__file__).resolve().parent

是获取当前脚本所在目录的黄金标准。它们都会返回一个适用于当前操作系统的绝对路径。构建路径:永远不要手动拼接路径字符串,而是使用

os.path.join()

或

pathlib

的

/

操作符。这能确保路径分隔符的正确性。解析符号链接:在某些情况下,文件或目录可能是一个符号链接。

os.path.realpath()

或

pathlib.Path().resolve()

能够解析这些链接,返回它们指向的实际物理路径,这对于避免一些部署上的混淆很有帮助。

通过遵循这些实践,我们可以大大减少因操作系统差异导致的路径问题,让Python脚本在任何平台上都能稳健地运行。毕竟,编写一次,到处运行,才是Python的魅力所在。

以上就是python如何获取脚本所在的目录_python获取当前执行脚本文件所在路径的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1371280.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
python怎么将一个嵌套列表扁平化_python嵌套列表扁平化方法
上一篇 2025年12月14日 11:18:13
python如何计算程序的运行时间_python计算代码执行时间的方法
下一篇 2025年12月14日 11:18:32

相关推荐

  • sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符

    sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符

    在Sublime Text中替换换行需启用正则模式,用n或R表示换行符。开启”.*”按钮后,查找用n、rn或R匹配不同换行格式,替换时用n插入换行,如将逗号替换为n可实现分行效果。 在Sublime Text中进行查找替换时,如果需要使用换行符,可以通过正则表达式模式来实现。…

    2026年9月28日 • 用户投稿
    100
  • linux怎么进入shell

    linux怎么进入shelllinux怎么进入shelllinux怎么进入shelllinux怎么进入shell

    有五种方法可以进入 Linux shell:打开终端窗口、使用 shell 命令、从桌面环境切换、通过 SSH、从引导菜单进入。 如何进入 Linux Shell Linux shell 是一个命令行界面,用户可以使用文本命令与操作系统交互。以下是一些进入 Linux shell 的方法: 1. 打…

    2026年9月28日 • 用户投稿
    000
  • 按W弹出工作区怎么办?Win10专业版按W弹出工作区解决方法

    按W弹出工作区怎么办?Win10专业版按W弹出工作区解决方法按W弹出工作区怎么办?Win10专业版按W弹出工作区解决方法按W弹出工作区怎么办?Win10专业版按W弹出工作区解决方法按W弹出工作区怎么办?Win10专业版按W弹出工作区解决方法

    近期,部分win10用户反馈,有时按下“w”键会出现ink工作区突然弹出的现象。如果你也遇到了这种情况,可以参考以下由小编整理的win10专业版解决按w弹出工作区的方法,问题的解决方案就在里面。 操作步骤如下: 首先,打开计算机,打开运行窗口,输入命令“regedit”,然后点击“确定”按钮; 随后…

    2026年9月28日 • 用户投稿
    100
  • 运维新概念:高效积累之道

    运维新概念:高效积累之道运维新概念:高效积累之道运维新概念:高效积累之道运维新概念:高效积累之道

    当前技术更新日新月异,各类语言、工具和理念层出不穷,令人应接不暇。唯有持续学习、不断吸收新知,方能紧跟发展潮流,不被时代淘汰。 1、 IT部门面临诸多挑战 2、 目前,IT部门整体尚未获得充分认可。尽管信息化在各单位日益重要,仍有部分管理者将其视为单纯的成本支出部门,认为其只消耗资源而无法直接创收,…

    2026年9月28日 • 用户投稿
    100
  • sublime prettier插件配置_Prettier代码格式化插件配置指南

    sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南

    首先安装JsPrettier插件并配置prettier_cli_path和node_path路径,设置format_on_save_enabled为true以实现保存时自动格式化,确保prettier_options与项目规则一致,推荐在项目中本地安装Prettier并通过快捷键Ctrl+Alt+F…

    2026年9月28日 • 用户投稿
    000
  • 国产操作系统上手体验(从零开始)

    国产操作系统上手体验(从零开始)国产操作系统上手体验(从零开始)国产操作系统上手体验(从零开始)国产操作系统上手体验(从零开始)

    随着信息技术的飞速发展,操作系统作为计算机硬件和软件之间的桥梁,起到了至关重要的作用。然而,长期以来,我们在使用个人电脑和移动设备时,一直依赖于外国公司开发的操作系统,对于这些系统的安全性和数据隐私问题一直存在担忧。为了解决这一问题,国内开发者近年来推出了一系列功能强大、安全可靠的国产操作系统,本文…

    2026年9月28日 • 用户投稿
    000
  • sublime怎么设置成便携版_Sublime Text创建与使用Portable便携版本

    sublime怎么设置成便携版_Sublime Text创建与使用Portable便携版本sublime怎么设置成便携版_Sublime Text创建与使用Portable便携版本sublime怎么设置成便携版_Sublime Text创建与使用Portable便携版本sublime怎么设置成便携版_Sublime Text创建与使用Portable便携版本

    下载Sublime Text便携版.zip并解压;2. 在解压目录创建Data文件夹;3. 启动sublime_text.exe即进入便携模式,所有配置自动存于Data内;4. 通过复制Data文件夹可实现设置备份与迁移,无需安装或注册表修改,跨设备使用便捷。 Sublime Text 本身不提供官…

    2026年9月28日 • 用户投稿
    000
  • linux换行符怎么打

    linux换行符怎么打linux换行符怎么打linux换行符怎么打linux换行符怎么打

    在 Linux 中,换行符表示当前行结束,通常用 ASCII 码 10 (LF) 表示。在命令行中,可以通过按 Enter 键、使用 “n” 字符串或按 Shift+Enter 来打换行符。换行符用于将输出分隔到新行、创建多行命令,或在文本文件中创建新行。 Linux 中的换…

    2026年9月28日 • 用户投稿
    000
  • Web无插件RTSP视频流直播系统EasySearcher探测工具无法运行是什么原因?

    Web无插件RTSP视频流直播系统EasySearcher探测工具无法运行是什么原因?Web无插件RTSP视频流直播系统EasySearcher探测工具无法运行是什么原因?Web无插件RTSP视频流直播系统EasySearcher探测工具无法运行是什么原因?Web无插件RTSP视频流直播系统EasySearcher探测工具无法运行是什么原因?

    easynvr分为硬件版本和软件版本,两者的功能基本一致。然而,硬件版本的配置需要额外进行探索和接入步骤才能完成部署。探索功能需要使用tsingsee青犀视频自主研发的easysearcher探测工具,该工具可以在easynvr的官方网站上下载。 在某些情况下,EasySearcher探测工具可能会…

    2026年9月28日 • 用户投稿
    100
  • 显示器HDR效果的真实表现取决于哪些关键因素?

    HDR效果的好坏取决于峰值亮度、局部调光、色域覆盖和色彩深度的协同作用,其中局部调光与峰值亮度同等重要,能显著提升对比度和画面层次,而HDR400因亮度不足且常缺乏局部调光,实际体验有限,建议选择DisplayHDR 600及以上标准,并确保内容源、连接接口(如HDMI 2.0或DP 1.4)及系统…

    2026年9月28日
    000
  • 乌鲁木齐银行定向采购 Oracle、IBM、Redhat

    2022年2月18日,乌鲁木齐银行发布《正版oracle软件采购项目》公开询价公告,控制价 283 万元。 采购内容:主要目标为以数量授权模式采购,采购Oracle数据库6C,Oracle weblogic 4C,Oracle集群2C,Oracle ADG 2C。 2022年3月1日发布成交公告,新…

    2026年9月28日
    000
  • 新安装win10怎么登录老账户的详细介绍

    新安装win10怎么登录老账户的详细介绍新安装win10怎么登录老账户的详细介绍新安装win10怎么登录老账户的详细介绍新安装win10怎么登录老账户的详细介绍

    在windows 10系统里,能够通过微软账户登录,但不少用户在重装系统后进入设置界面时,往往不清楚如何使用之前的微软账户来继续操作。那么,新安装的系统如何使用旧账户呢?下面,我们将为大家介绍具体的操作步骤。 如何在新装的Windows 10系统中登录旧账户 点击桌面左下角的开始按钮。 进入设置页面…

    2026年9月28日 • 用户投稿
    1000
  • 深入理解Java泛型:类型参数与方法重载的实践指南

    深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南

    本文深入探讨了Java泛型中关于类型参数与泛型类实例在方法签名中的区别,以及由此引发的类型不匹配问题。通过一个具体的代码示例,详细解析了为何在泛型方法中,直接传入泛型类实例或其内部类型参数会引发编译错误,并提供了利用方法重载这一核心机制来优雅地解决此类问题的专业指导和示例代码,帮助开发者清晰理解“h…

    2026年9月28日 • 用户投稿
    100
  • linux怎么在jvm启动参数

    linux怎么在jvm启动参数linux怎么在jvm启动参数linux怎么在jvm启动参数linux怎么在jvm启动参数

    在 Linux 中设置 JVM 启动参数可以通过编辑启动脚本,使用 -javaagent 或 -D 标记添加参数。常用参数包括:-Xmx(设置最大堆内存大小)、-Xms(设置初始堆内存大小)、-XX:+UseG1GC(指定 G1 垃圾收集器)、-Dlog4j.configurationFile=lo…

    2026年9月28日 • 用户投稿
    100
  • sublime怎么多行编辑_Sublime多光标与多行编辑技巧详解

    sublime怎么多行编辑_Sublime多光标与多行编辑技巧详解sublime怎么多行编辑_Sublime多光标与多行编辑技巧详解sublime怎么多行编辑_Sublime多光标与多行编辑技巧详解sublime怎么多行编辑_Sublime多光标与多行编辑技巧详解

    掌握Sublime Text多光标与列编辑技巧可大幅提升效率:1. 按Ctrl/Cmd点击或Ctrl+Alt+方向键添加多光标;2. 用Ctrl+D选相同词,Ctrl+Shift+L拆分多行;3. Shift+Alt拖动实现列选择;4. 应用于批量加符号、生成代码、对齐数据等场景。 Sublime …

    2026年9月28日 • 用户投稿
    100
  • linux怎么显示隐藏文件

    linux怎么显示隐藏文件linux怎么显示隐藏文件linux怎么显示隐藏文件linux怎么显示隐藏文件

    可以通过以下方法在 Linux 中显示隐藏文件:使用 ls 命令:ls -a 或 ls -al;使用 grep 命令:ls | grep .;使用 find 命令:find . -name “.*”;使用文件管理器:通过启用显示隐藏文件的选项。 如何显示 Linux 中的隐藏…

    2026年9月28日 • 用户投稿
    000
  • 如何用豆包AI写协程代码 协程代码的AI编写技巧大公开

    如何用豆包AI写协程代码 协程代码的AI编写技巧大公开如何用豆包AI写协程代码 协程代码的AI编写技巧大公开如何用豆包AI写协程代码 协程代码的AI编写技巧大公开如何用豆包AI写协程代码 协程代码的AI编写技巧大公开

    用豆包ai写协程代码的关键在于提问方式与后续优化。一、明确所需协程类型,如并发下载或任务管理,提问越具体生成代码越实用;二、注意避免阻塞调用,如将time.sleep改为await asyncio.sleep;三、善用提示词提升代码质量,如指定库、并发数及异常处理;四、结合项目结构调整代码,适配模块…

    2026年9月28日 • 用户投稿
    200
  • 电脑长时间不关机会对硬件造成不可逆损伤吗?

    电脑长时间不关机会对硬件造成不可逆损伤吗?电脑长时间不关机会对硬件造成不可逆损伤吗?电脑长时间不关机会对硬件造成不可逆损伤吗?电脑长时间不关机会对硬件造成不可逆损伤吗?

    长时间不关机不会造成不可逆损伤,但会加速硬件老化。持续运行导致散热系统、机械硬盘、电源电容等部件损耗加剧,尤其是风扇磨损和高温环境下电容老化,影响整体寿命。虽然现代硬件设计成熟,具备保护机制,但长期高温运行仍会缩短CPU、GPU周边元件及SSD写入寿命。相较之下,频繁开关机的热胀冷缩影响较小,适度重…

    2026年9月28日 • 用户投稿
    000
  • sublime怎么显示空格和制表符_Sublime Text显示所有空白字符设置

    sublime怎么显示空格和制表符_Sublime Text显示所有空白字符设置sublime怎么显示空格和制表符_Sublime Text显示所有空白字符设置sublime怎么显示空格和制表符_Sublime Text显示所有空白字符设置sublime怎么显示空格和制表符_Sublime Text显示所有空白字符设置

    开启Sublime Text的“draw_white_space”: “all”设置可显示空格为·、制表符为→,便于检查缩进和空白字符,提升代码规范性。 在Sublime Text中显示空格和制表符,可以帮助你更清楚地查看代码中的空白字符,提升代码整洁度和可读性。要开启显示所…

    2026年9月28日 • 用户投稿
    000
  • Win10计算器应用现在支持图形模式下的深色主题

    Win10计算器应用现在支持图形模式下的深色主题Win10计算器应用现在支持图形模式下的深色主题Win10计算器应用现在支持图形模式下的深色主题Win10计算器应用现在支持图形模式下的深色主题

    去年3月,微软宣布正在为Windows Calculator应用开发全新的图形化功能。今年,微软已开始在Windows 10及Windows 10 S设备上逐步推出这一图形模式功能。近期,微软通过更新Windows 10计算器至10.2005.23.0版本,进一步增强了图形模式,新增了深色主题的支持…

    2026年9月28日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信