卷啊卷:使用批处理在虚拟环境中运行Python

昨天用大半天的时间,写了Python+OpenCV来调整照片尺寸的程序,终于不用再一张张手动调图啦,但是我还是有些不满意。

image.png
(图源 :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

一切看起来都很正常:
image.png

但如若我们在test.py中导入OpenCV 模块(import cv2),那么运行test.bat就会出现如下错误:

image.png

这个其实很好理解,因为我们的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

运行起来也没有问题:

image.png

但是其实,这相当于,在一个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虚拟运行环境中,符合我们程序的本意。

相关链接

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now