更改当前工作目录的坑
linux运维过程中经常会写这样的shell脚本:
trade_date=$1
# 对比业务日志
cd /workplace/compareTools/
python3 compareBiz.py $trade_date > biz.log
cd -
# 对比流水
cd /workplace/compare_storage_tool/bin
sh compare.sh $trade_date
cd -
# 搜集对比结果
rm -rf log/$trade_date
mkdir log/$trade_date
cp /workplace/compareTools/*.log log/$trade_date
上面这个脚本做了这么几件事情:
1、首先接收一个交易日期的参数,例如20230106
2、然后分别进入到业务日志对比工具和流水对比工具的目录下,执行对比工具
3、最后搜集一下对比的结果日志
其中的cd指令会更改shell当前的工作目录,只有在正确的工作目录下才能找到对比工具。
于是我心血来潮,把shell脚本改成了python脚本:
import subprocess,sys
trade_date = sys.argv[1]
# 对比业务日志
subprocess.run('cd /workplace/compareTools/', shell=True)
subprocess.run('python3 compareBiz.py %s > biz.log' % trade_date, shell=True)
subprocess.run('cd -', shell=True)
# 对比流水
subprocess.run('/workplace/compare_storage_tool/bin', shell=True)
subprocess.run('sh compare.sh %s' % trade_date, shell=True)
subprocess.run('cd -', shell=True)
# 搜集对比结果
subprocess.run('rm -rf log/%s' % trade_date, shell=True)
subprocess.run('mkdir log/%s' % trade_date, shell=True)
subprocess.run('cp /workplace/compareTools/*.log log/%s' % trade_date, shell=True)
太完美了,用subprocess就搞定了。看起来没什么问题,该更改当前工作目录的地方都用了cd指令。
结果日志对比和流水对比失败,原因是找不到compareBiz.py和compare.sh … …
咋掉坑里的
在“subprocess.run(‘cd /workplace/compareTools/’, shell=True)”之后,通过"print(os.getcwd)"查看一下当前的工作目录,居然没有变化!!!!!
罪魁祸首就是“subprocess.run(‘cd xxx’, shell=True)”,这样写并不能改变python脚本的工作目录!!!!!!
怎样正确更改python脚本的工作目录
本来想优雅的改,于是想到了pathlib库的Path类。手册查了半天悲剧了,也是我才疏学浅,改不了… …
最后又回到了那个极其不优雅的os.chdir。好在它在3.6以后可以接 path-like object了,可以优雅的用Path啦!!!!!!!!