sys.path 与 os.getcwd区分:代码运行中的路径问题

发布时间:2026/10/10 13:05:02

sys.path 与 os.getcwd区分:代码运行中的路径问题 获取当前工作目录import sys print(sys.path[0])获取执行命令的位置import os print(os.getcwd())python 代码运行路径问题在下载使用别人的代码进行运行时有时会遇到路径问题。将自己目前遇到的进行分类和总结。主要分为两类import相关 open文件相关问题的来源是IDE和cmd的默认工作路径的差异或模块搜索路径不同。即可能是自己和对方使用的IDE的不同默认工作路径导致的。当前工作目录文件读写等相关操作使用的基本路径。通过函数os.getcwd()获得通过函数os.chdir()改变os.path功能作为对路径进行操作的模块注意在cmd下运行时 文件组织 folder file.py python folder/file.py 当前工作目录在父亲目录 python file.py : 当前工作目录在folder下常见问题打开文件描述符时出错找不到对应的文件FileNotFoundError: [Errno 2] No such file or directory解决修改要读写的文件路径系统搜索路径sys.path数据类型字符串数组 功能确定模块搜索路径 初始化系统环境变量PYTHONPATH 默认安装路径比如在终端输入export PYTHONPATH$PYTHONPATH:/home/.../MinkLoc3Dv2常见问题import 模块时出错需要导入的的代码不在sys.path中ModuleNotFoundError: No module named解决将对应模块所在的路径加入到sys.path中。比如在代码中加入sys.path.append(‘/home/zs/project/github/minkloc3d/MinkLoc3Dv2’)如果对应模块在子文件夹下可以通过在子文件夹下创建init.py文件解决。相当于对子文件目录升级为模块附件资料标题os.getcwd()、sys.path[0]、sys.argv[0]和__file__的区别os.getcwd()、sys.path[0]、sys.argv[0]和__file__的区别,终于弄清楚了要分清这几个的区别与使用条件实际测试一下是最准确的。设计测试方法一个主模块用来运行一个子模块用来被主模块调用 主模块路径/Users/stephen/Documents/code/test_dir/01test子模块路径/Users/stephen/Documents/code/test_dir/02test运行模块的路径/Users/stephen/Documents/code/test_dir/01test/001_testok 现在编写两模块代码子模块 submodule.py import os import sys def child_test(): print(sub os.getcwd():{}.format(os.getcwd())) print(sub sys.path[0]:{}.format(sys.path[0])) print(sub sys.argv[0]:{}.format(sys.argv[0])) print(sub __file__:{}.format(__file__)) if __name__ __main__: chid_test() 主模块 mainmodule.py import os import sys import submodule def main(): print(main os.getcwd():{}.format(os.getcwd())) print(main sys.path[0]:{}.format(sys.path[0])) print(main sys.argv[0]:{}.format(sys.argv[0])) print(main __file__:{}.format(__file__)) submodule.child_test() if __name__ __main__: main()目录结构├── 01test │ ├── 001_test # 运行目录 │ └── mainmodule.py # 主模块 └── 02test └── submodule.py # 被调用模块ok 来看看结果Traceback (most recent call last): File ../mainmodule.py, line 3, in module import submodule ModuleNotFoundError: No module named submodule我去出现了点小状况原因是系统找不到该模块的路径我们来人工添加一个路径在主模块中前面添加sys.path.append(‘/Users/stephen/Documents/code/test_dir/02test/’)再来试试 - -结果如下main os.getcwd():/Users/stephen/Documents/code/test_dir/01test/001_test main sys.path[0]:/Users/stephen/Documents/code/test_dir/01test main sys.argv[0]:../mainmodule.py main __file__:../mainmodule.py sub os.getcwd():/Users/stephen/Documents/code/test_dir/01test/001_test sub sys.path[0]:/Users/stephen/Documents/code/test_dir/01test sub sys.argv[0]:../mainmodule.py sub __file__:/Users/stephen/Documents/code/test_dir/02test/submodule.py结合目录结构看就清楚了├── 01test │ ├── 001_test # 运行目录 │ └── mainmodule.py # 主模块 └── 02test └── submodule.py # 被调用模块 os.getcwd() 指的是运行程序的目录 (绝对路径) sys.path[0] 主要模块的目录 绝对路径 sys.argv[0] 运行模块时pyhton 后面的参数 __file__ 这个就有点奇怪了主模块显示的相对路径而被调用模块却用的绝对路径 __file__ 还是有点疑虑于是去 stack overflow(click to)看到了这句话如下 So, if you are outside the part of sys.path that contains the module, youll get an absolute path. If you are inside the part of sys.path that contains the module, youll get a relative path. If you load a module in the current directory, and the current directory isnt in sys.path, youll get an absolute path. If you load a module in the current directory, and the current directory is in sys.path, youll get a relative path.意思大致是如果你(你所在的当前目录)不在sys.path的范围里你会得到绝对路径反之你会得到相对路径如果你在当前目录加载模块并且当前目录在sys.path 里 你会得到相对路径。对比上面的结果符合。不过我们还是应该再来验证下。我们把当前路径换到子模块下├── 01test │ ├── 001_test │ └── mainmodule.py # 主模块 └── 02test # 当前目录 └── submodule.py # 被调用模块结果如下main os.getcwd():/Users/stephen/Documents/code/test_dir/02test main sys.path[0]:/Users/stephen/Documents/code/test_dir/01test main sys.argv[0]:../01test/mainmodule.py main __file__:../01test/mainmodule.py sub os.getcwd():/Users/stephen/Documents/code/test_dir/02test sub sys.path[0]:/Users/stephen/Documents/code/test_dir/01test sub sys.argv[0]:../01test/mainmodule.py sub __file__:/Users/stephen/Documents/code/test_dir/02test/submodule.py是不是觉得有问题幸亏我们测试了突然想起我我运行mainmodule用的相对路径像这样$ python …/01test/mainmodule.py然后__file__就是相对路径的如果我们换成绝对路径呢$ python /Users/stephen/Documents/code/test_dir/01test/mainmodule.py结果如下main os.getcwd():/Users/stephen/Documents/code/test_dir/02test main sys.path[0]:/Users/stephen/Documents/code/test_dir/01test main sys.argv[0]:/Users/stephen/Documents/code/test_dir/01test/mainmodule.py main __file__:/Users/stephen/Documents/code/test_dir/01test/mainmodule.py sub os.getcwd():/Users/stephen/Documents/code/test_dir/02test sub sys.path[0]:/Users/stephen/Documents/code/test_dir/01test sub sys.argv[0]:/Users/stephen/Documents/code/test_dir/01test/mainmodule.py sub __file__:/Users/stephen/Documents/code/test_dir/02test/submodule.pysoga!终于弄清楚了突然有种小兴奋啊总结一下os.getcwd() 指的是当前目录绝对路径 sys.path[0] sys.path 指的是pathsys.path[0]为主模块目录的绝对路径在模块运行的时候被自动添加进去 sys.argv[0] 就是你运行时 python 后面跟的参数 __file__ 表示所在模块文件的路径和系统找到该模块的方式有关你是用绝对路径去加载该模块那么__file__就为绝对模块文件路径如果你给系统提供相对路径去加载该模块那么改文件路径为相对路径案例demo自己的工程代码修改了自己的代码然后单卡上能跑到自己修改的代码但是多卡训练的时候就跑不到自己修改的代码像是跑到了pip安装的库。原因是需要加上下面的代码注一在终端或者~/.bashrc里直接添加PYTHONPATH/data/perception/bev/adb/adb_code/ADB_DLA:$PYTHONPATH不管用_p os.environ.get(“PYTHONPATH”, “”)os.environ[“PYTHONPATH”] “/data/perception/bev/adb/adb_code/ADB” (os.pathsep _p if _p else “”)importos os.chdir(os.path.dirname(__file__))importsys sys.path.insert(0,/data/perception/bev/adb/adb_code/ADB)# 多卡 DDP 子进程由 torchrun 拉起需能 import 本地 ultralytics非 pip 安装通过 PYTHONPATH 传递_pos.environ.get(PYTHONPATH,)os.environ[PYTHONPATH]/data/perception/bev/adb/adb_code/ADB(os.pathsep_pif_pelse)
延伸阅读

更多相关文章

2026/10/8 2:21:30

@EnableRetry注解解读

<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency> 前言 在分布式系统、微服务架构以及对外部服务&#xff08;如数据库、第三方API、消息队列&#xff09;的调用中&#xf…

2026/10/8 2:21:39

【2014-04-27】windows用户管理命令

[历史归档] 本文原发布于 cstriker1407.info 个人博客&#xff0c;内容为历史存档&#xff0c;仅供参考。 发布时间&#xff1a; 2014-04-27 &#xff5c; 标题&#xff1a;windows用户管理命令 &#xff5c; 分类&#xff1a; 操作系统 / windows &#xff5c; 标签&…

2026/10/8 3:30:03

GDB 使用指南

GDB 官网 https://www.sourceware.org/gdb/ GDB 是什么东西&#xff1f; GDB, the GNU Project debugger, allows you to see what is going on inside’ another program while it executes – or what another program was doing at the moment it crashed. &#x1f447; …

2026/10/10 13:02:26

鸿蒙跨设备剪贴板开发:从PasteData到分布式KV的完整实践

手机复制地址&#xff0c;平板那边马上能粘贴&#xff1b;电脑上复制一段代码&#xff0c;手机顺手就能贴进备忘录。这是我接触鸿蒙跨设备剪贴板之后&#xff0c;最直观也最上头的体验。刚开始我并不觉得这算什么大功能&#xff0c;直到自己动手写了一个跨设备剪贴板的小工具&a…

2026/10/10 13:02:26

epoll原理与高并发实战:从C10K到百万连接的I/O多路复用核心

1. 为什么“epoll”这个词总在深夜的服务器日志里闪现你有没有过这样的经历&#xff1a;凌晨两点&#xff0c;线上服务突然响应变慢&#xff0c;监控曲线像心电图一样剧烈抖动。运维同事甩来一条命令行截图——strace -p $(pgrep -f server) | grep epoll&#xff0c;后面跟着一…

2026/10/10 13:02:26

路由器故障排查全指南:从硬件到软故障的实战手册

简介&#xff1a;这份文档资料聚焦计算机网络中路由器的常见故障与处理思路&#xff0c;面向网络运维初学者、计算机专业学生以及需要排查家庭或小型办公网络问题的技术人员。内容从路由器的硬件组成讲起&#xff0c;涵盖处理器、DRAM、BootROM、NVRAM、Flash及系统软件等核心部…

2026/10/10 13:02:26

复现BOA改进三件套:Circle混沌初始化、非线性因子与正余弦融合

1. 为什么我决定复现这个“三件套”改进蝴蝶优化算法&#xff08;BOA&#xff09;在群体智能算法里不算冷门&#xff0c;它靠“气味浓度”来引导个体位置更新的机制很特别&#xff0c;代码写起来也比粒子群简单。但这两年我陆陆续续看了不少BOA改进文章&#xff0c;发现一个普遍…

2026/10/10 12:57:22

深度学习十年演进:从卷积网络到Transformer的工程实践复盘

2012年我刚入行的时候&#xff0c;谁要是在组会上说“咱们把图像识别的特征工程全扔掉&#xff0c;让网络自己学”&#xff0c;大概率会被当成刚看完科幻电影的热血青年。但十年之后&#xff0c;当年那套“让网络自己学”的思路已经把整个行业从头到脚换了一遍。我也是在那几年…

2026/10/10 7:31:36

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起&#xff1a;为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高&#xff0c;很多人第一次听到会以为是某个新模型的名字&#xff0c;其实它更像是一种思路——把Jev模型的能力当作底座&#xff0c;通过Agent的方式去接管浏览器&#xf…

2026/10/9 20:15:56

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同"&#xff1a;多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西&#xff0c;大概率会有一种感觉&#xff1a;单个 Agent 能做的事情&#xff0c;其实很快就摸到天花板了。你给它一个提示词&#xff0c;挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 0:04:53

从逻辑门到计算机:数字电路核心原理与全加器搭建实战

如果你拆过一台旧电脑的主板&#xff0c;盯着那些黑乎乎的小芯片看上一会儿&#xff0c;可能会冒出同一个疑问&#xff1a;这堆引脚密集的元件&#xff0c;到底是怎么“变”出那么复杂的应用的&#xff1f;答案并不在某个神秘的部件里&#xff0c;而是在所有芯片内部都在反复使…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑