从脚本目录/当前目录运行Python脚本时os.chdir报错WinError 123如何解决?
问题根本原因
- 报错的核心是
os.path.dirname(sys.argv[0])返回了空字符串'',向os.chdir()传入空路径触发了WinError 123语法错误。 - 触发场景:你在脚本所在的当前目录直接执行脚本,比如运行命令
python install_uwp.py,此时sys.argv[0]的值只有纯文件名没有前置路径,os.path.dirname()处理纯文件名时默认返回空字符串。 - 旧脚本运行正常是因为此前的调用场景都带路径前缀(比如从其他目录调用
python .\tools\old_script.py或者直接传完整路径执行),sys.argv[0]带路径信息所以可以正常提取目录。
排查方法
在切换工作目录的代码前添加调试打印,确认参数实际值:
print(f"sys.argv[0] = {repr(sys.argv[0])}, 提取到的目录 = {repr(os.path.dirname(sys.argv[0]))}")
运行脚本后即可直观验证是不是目录提取结果为空。
修复方案
不要依赖sys.argv[0]的路径信息,改用稳定性更高的方式获取脚本所在目录:
方案1(常规Python运行场景,兼容Python 3.4+)
import os import sys # 从内置变量__file__获取当前脚本的绝对路径,再提取目录 script_dir = os.path.dirname(os.path.abspath(__file__)) os.chdir(script_dir)
__file__是Python内置的固定变量,始终存储当前脚本的完整路径,不受调用方式影响。
方案2(兼容打包为exe的场景)
如果你后续会用PyInstaller等工具把脚本打包为单文件exe,用以下兼容写法:
import os import sys if getattr(sys, 'frozen', False): # 打包后的运行环境,取exe所在目录 script_dir = os.path.dirname(sys.executable) else: # 普通Python脚本运行环境 script_dir = os.path.dirname(os.path.abspath(__file__)) os.chdir(script_dir)
内容的提问来源于stack exchange,提问作者MC874
相关产品推荐
相关产品推荐

