Python编程 | 系统编程 | 脚本运行上下文 | 当前工作路径

Python编程 | 系统编程 | 脚本运行上下文 | 当前工作路径

当前工作路径(CWD)在脚本的执行中是一个重要的概念。除非指定了绝对路径, 否则当脚本处理文件时将始终默认它们存在于CWD**。如前所述,脚本可以使用os.getcwd获取明确的CWD路径,使用os.chdir可以改变它的CWD。

谨记,没有完整目录路径的文件名将被映射到CWD路径,和你的PYTHONPATH设置无关。从技术上讲,一个脚本总是启动于CWD,而非它所在的目录。反之,import永远首先搜索文件所在的目录,而非CWD(除非该脚本刚好在CWD目录)。

CWD、文件和import路径

当你输入一个shell命令行,比如python dir1/dir2/file.py来运行该脚本时,CWD你键入该命令时所处的路径而非dir1/dir2。另一方面,Python自动将脚本所处目录添加到模块搜索路径最前,因而无论在哪儿运行,file.py总是可以导入*dir1/dir2/*中的其他文件。

我们编写一个简单的脚本,打印出它的CWD模块搜索路径来说明:

alone@alone-Vostro-14-5401:/media/alone/Coding/Python/Python项目/pp4e/system$ cat where_am_i.py 
import os
import sys
from icecream import ic


ic(os.getcwd())
ic(sys.path[:6])
input()
alone@alone-Vostro-14-5401:/media/alone/Coding/Python/Python项目/pp4e/system$ cd ..
alone@alone-Vostro-14-5401:/media/alone/Coding/Python/Python项目/pp4e$ set PYTHONPATH=/media/alone/Coding/
alone@alone-Vostro-14-5401:/media/alone/Coding/Python/Python项目/pp4e$ python system/where_am_i.py
ic| os.getcwd(): '/media/alone/Coding/Python/Python项目/pp4e'
ic| sys.path[:6]: ['/media/alone/Coding/Python/Python项目/pp4e/system',
                   '/home/alone/anaconda3/lib/python37.zip',
                   '/home/alone/anaconda3/lib/python3.7',
                   '/home/alone/anaconda3/lib/python3.7/lib-dynload',
                   '/home/alone/anaconda3/lib/python3.7/site-packages']

alone@alone-Vostro-14-5401:/media/alone/Coding/Python/Python项目/pp4e$ set PYTHONPATH=/home/alone
alone@alone-Vostro-14-5401:/media/alone/Coding/Python/Python项目/pp4e$ python system/where_am_i.py
ic| os.getcwd(): '/media/alone/Coding/Python/Python项目/pp4e'
ic| sys.path[:6]: ['/media/alone/Coding/Python/Python项目/pp4e/system',
                   '/home/alone/anaconda3/lib/python37.zip',
                   '/home/alone/anaconda3/lib/python3.7',
                   '/home/alone/anaconda3/lib/python3.7/lib-dynload',
                   '/home/alone/anaconda3/lib/python3.7/site-packages']

这里,有两个陷阱我们需要避免:

  1. 如果不确定脚本的执行路径,最好使用完整的目录路径限定的文件名
  2. 命令行脚本不能总是依赖于CWD来导入不在它所处目录的文件,而应使用PYTHONPATH设置包导入路径来访问其他目录中的模块

CWD和命令行

alone@alone-Vostro-14-5401:/media/alone/Coding/Python/Python项目/pp4e$ python ../../clean.py # process CWD
alone@alone-Vostro-14-5401:/media/alone/Coding/Python/Python项目/pp4e$ python ../../find.py *.py /home/alone/ # process named dir
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RizzoHou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值