卷啊卷:使用批处理在虚拟环境中运行Python
昨天用大半天的时间,写了Python+OpenCV来调整照片尺寸的程序,终于不用再一张张手动调图啦,但是我还是有些不满意。
(图源 :pixabay)
哪里不满意呢?就是要使用调图程序还是还比较麻烦的,使用步骤如下:
- 将图片放置到指定目录
- 启动命令行程序(
cmd)- 切换到程序所在分区(
E)- 进入到程序所在目录(
cd study)- 启动Python虚拟运行环境(
.venv\Scripts\activate)- 运行相应的程序(
python resize.py)
这一套组合拳下来,图片调整完毕,相比以前手动操作至少要节省99%以上的时间,但是作为一个精益求精的程序猿,怎么能容忍每天做这么多重复劳动呢?(呸,以前每天手动调图不是你呀?)
是可忍熟不可忍,O哥必须把这1%的时间再极度压缩,一秒钟都不能浪费。
那要怎么压缩呢?其中第一项是必须可少的,将图片放到指定目录这样可以避免误操作之类的,而且也方便每次在浏览器中传图。但是剩下的步骤,似乎可以用批处理脚本来完成呀?
说到批处理脚本,那可是我最先接触的计算机编程“语言”呢,好吧,姑且叫它语言吧,几十年前刚接触计算机,老师还没教我们编程时,我批处理玩得贼拉溜。
那时候最喜欢做的事,就是弄一个自动批处理程序(autoexec.bat),然后在其中设置上“骂人”的话语,比如“XXX大傻瓜”之类的,然后等同学们上机挨骂,我乐此不疲。
额,扯远了,一提到当年的事情,就打不住呢?这是人上了年纪的通病嘛?
言归正传,准备用批处理来实现上述功能。
按说批处理实现上述功能很简单,罗列相应的命令即可,比如通过批处理运行test.py(print("Hello World!")):
echo "Start image processing"
E:
cd E:\study
python test.py
pause
一切看起来都很正常:
但如若我们在test.py中导入OpenCV 模块(import cv2),那么运行test.bat就会出现如下错误:
这个其实很好理解,因为我们的OpenCV模块是在Python虚拟运行环境中安装的,而这个批处理文件直接调用的常规Python环境,当然行不通啦。
那么如何进入到Python虚拟环境中并执行相应的Python脚本呢?直接在bat文件中添加.venv\Scripts\activate,再执行脚本就死掉了,肯定是行不通的。
网上别人的方案是这样的,添加类似如下的语句:
cmd /K "E:\study\.venv\Scripts\activate & python test.py"
全部脚本内容如下:
@echo "Start image processing"
E:
cd E:\study
cmd /K ".venv\Scripts\activate & python test.py"
pause
运行起来也没有问题:
但是其实,这相当于,在一个cmd窗口中,重新启用一个新窗口并且在新窗口中运行两条相应指令(包括运行Python),然后停留在新窗口中。
如果我们在cmd /K ".venv\Scripts\activate & python test.py"下一行重新加一句python test.py就会发现这个显著的问题。第二句python test.py依旧会出错。
事实上,到这,我们就可以收工啦,虽然不优雅,但是我们都放到新窗口,都放到一条语句中又如何呢?
不过一个优雅的人,怎么能允许不优雅的事情存在呢?经过我一番探索,以及挖掘几十年前的记忆,发现优雅的脚本应该是这样的:
@echo "Start image processing"
E:
cd E:\study
call .venv\Scripts\activate
python test.py
pause
因为.venv\Scripts\activate实际上也是一个批处理文件(.bat),所以我们可以用call指令来调用,这样,我们就在一个cmd窗口内完成所有操作了,后续如果运行其它Python程序,也是在Python虚拟运行环境中,符合我们程序的本意。
相关链接
Leave 卷啊卷:使用批处理在虚拟环境中运行Python to:
Read more #cn posts
Best Posts From oflyhigh
We have not curated any of oflyhigh's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.