公司在阿里云购买了一台Windows service2012 的服务器,一些公司的项目就部署在这台服务器上,得益于Python脚本语言的特性,需要经常部署一些定时任务的脚本,因此就经常会写一些Windows的.bat脚本放在任务计划程序,说起来惭愧,大大小小的任务计划也部署过好几次了,有些脚步部署完成之后运行时会出现闪退,有些却不会,几乎每隔一段时间就会部署一个新任务时就会遇到闪退的问题,然后又忘记了以前的处理办法,然后百度。。。找原因,真是奔溃,于是今天就抽空理了理思路,把一些内容记录下来,方便自己日后回来查看,也方便刚好有人踩到这个坑,给人一些提示。
问题描述:
回到刚刚的问题,python项目写完之后在pycharm运行时正常,但在Windows部署.bat脚本时出现闪退,如果是新人就会觉得奔溃,因为根本就看不到具体的闪退原因,cmd的窗口就关闭退出了,本项目导入模块的内容就这些:
这时为了能让窗口停留,就在导入的模块的时候加try except,同时在except中加入休眠时间方便定位原因:
然后再次运行.bat,于是就可以看到,标题中的ImportError错误,named xx不存在,daka是本项目自定义的库:
问题分析:
经过一番的百度各种查找,终于明白的了大概的原理,这其实就是关系到我们在安装Python的时候,安装完成(Python官方安装文件)或者在安装的时候(anaconda)把Python的一些路径添加环境变量,因此系统自带的各种库或者后面自己安装第三方的库都是默认安装在已经在系统环境变量的路径中;
当我们导入一个模块时:import xxx,默认情况下python解析器会搜索当前目录、已安装的内置模块和第三方模块,搜索路径存放在sys模块的path中,一般是在./site-packages下,通过sys库的sys.path可以看到目前Python中在环境变量中的路径:
通过上图可以到前文中自定义的daka是不在环境变量中的,因此在引入库的时候出现报错!
解决方案:
方案一:将daka所在的跟目录永久添加到环境变量中,由于我这个daka库所在的根本目录是
这里又有些坑需要注意,-_-||
1、添加自定义的模块到环境变量,不能添加到原来的Python的环境变量中,需要新增一个新的环境变量pythonpath,如下图:
2、划重点:一定要重启电脑才会生效!一定要重启电脑才会生效!一定要重启电脑才会生效!
方案二:在项目运行时,临时将本地路径添加到环境变量,这种方法在脚本运行完成后就会失效;
方案三:将自定义的模块放入到Python已包含的环境变量中,比如D:\\Anaconda3\\lib\\site-packages;
总结:
这个问题背后的原理其实很简单,但是每次处理完成之后,隔一段时间再遇到就会又忘记以前怎么处理了,还是以前老师那句话,好记性不如烂笔头
-_-||