openvino python 在各python编辑软件中提示no module named ”cv2“以及打包后无法正常运行点击没反应 等问题的一种普适解决方法

前言

以前用python编辑器运行报no module named 'cv2’一直没在意,还以为是编辑器用了python2的原因,因为python2里没有cv2,这次有需求要把程序打包问题就出来了,exe文件点了就结束了,什么也没发生。又想到以前的编辑器问题。在查询一堆资料后确定了不是打包的问题。最后意识到了是环境变量的问题。网上找了半个宇宙也没有解决方法。最后得出解决方案兜了地球一圈,但是总算是解决了,并且是一种普适的方法。现留下记录供和我遇到一样问题的朋友参考。有些东西我学习不是很深入,错误欢迎指正。另外有更方便的解决方法请务必告诉我哈哈。

问题背景

在树莓派上安装配置完openvino工具包之后,我可以正常在命令行运行py程序。但是如果我们用python编辑器运行同样的py程序时会提示no module named ‘cv2’。然后如果将py程序打包,双击exe文件之后也是什么都不会发生。

问题分析

正如我的这篇树莓派openvino配置博客
openvino python 在各python编辑软件中提示no module named ”cv2“以及打包后无法正常运行点击没反应 等问题的一种普适解决方法_第1张图片
可以看到跟着官方文档的方式设置环境,采用的方法是在命令行source了一个setupvars.sh的脚本文件,它帮忙配置好了环境变量,但是很可惜,这个应该只适用于终端中使用我们的openvino工具包。所以问题出在环境变量,当使用其他python编辑器或者打包时都没有这个环境变量的设置,因此py程序无法正常运行。
想到的第一个办法是在python里配置环境变量
先是试了os.system(“source xxxxxxx.sh”)并没有效果,原因是这样只是在子进程配置了环境变量,不会影响父进程
浏览了很多博客都说用os.environ配置
但是我看不懂sh文件啊,官方那个sh文件里面不知道怎么弄的,用os.environ我是完全不知道怎么搞,也怕乱弄搞崩了
所以我想到了下面的方法

解决方法

原理主要是间接的方法。
我假设要执行的是main.py,新建一个control.py,还要一个修改过的官方sh脚本文件【现在不用了】,下面详细说明

Step1 修改官方的环境变量配置文件【直接见更新改动这一步不用了】

打开setupvars.sh,在最后加入一条

python3 /你的/py/路径/main.py

openvino python 在各python编辑软件中提示no module named ”cv2“以及打包后无法正常运行点击没反应 等问题的一种普适解决方法_第2张图片
将文件另存为
我另存为了setupvars1.sh,放在你喜欢的地方。我就直接和原来的放一起了

Step2 编写control.py

其中代码如下

import subprocess
cmd = "source /home/pi/Downloads/inference_engine_vpu_arm/bin/setupvars1.sh" #根据你自己改的sh文件灵活更改
subprocess.call(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,executable="/bin/bash")

这里参考了https://www.mobibrw.com/2017/8141
用subprocess库的call方法(试过和参考大文章一样用popen,打包的时候可能会出现问题,程序运行一切正常,但我的main.py里面tkinter界面没显示出来。不过我无意间发现在control.py用tkinter的messagebox先弹出一下提示框,main.py的tkinter界面就能显示了,不知道怎么回事。但是反正我不需要用popen就没有深入研究了)
其中如果executable="/bin/bash“没有会报错说找不到source,因为subprocess.Popen执行Shell命令的时候默认调用/bin/sh,而sh里面没有source,bash才有

恭喜完成

这样就完成了一个间接运行要执行的main.py
通过control.py 运行 改过的加入了运行main.py命令的sh文件
这就达到了相当于在命令行先配置了环境变量然后输入python3 main.py的效果
对control.py你想干啥都行了
我解释一下为什么要做Step1,而不是在Step2分两步先source官方的sh脚本再python3 main.py。因为如果分两步就是两个子进程第一步的环境配置影响不到第二步的子进程环境。

更新改动

参考了这篇博客
https://blog.csdn.net/xiojing825/article/details/78207862
之前我不知道subprocess.call可以执行多条命令,现在知道了,所以不需要step1那一步改官方的sh了
直接写一个control.py具体如下

import subprocess
cmd1 = "source /home/pi/Downloads/inference_engine_vpu_arm/bin/setupvars.sh"
cmd2 = "python3 /你的/py/路径/main.py"
cmd = cmd1 + " && " + cmd2
subprocess.call(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,executable="/bin/bash")

这样就非常简单了哈哈
//希望这能帮到你

你可能感兴趣的:(树莓派)