使用pyinstaller打包Mediapipe项目时遇到FileNotFoundError: The path does not exist的解决方法

今天在帮朋友打包py文件时,遇到了下面问题:

Traceback (most recent call last):
  File "demo_windows.py", line 384, in <module>
  File "demo_windows.py", line 245, in recognize
  File "demo_windows.py", line 55, in __init__
  File "mediapipe\python\solutions\hands.py", line 114, in __init__
  File "mediapipe\python\solution_base.py", line 247, in __init__
FileNotFoundError: The path does not exist.
[13548] Failed to execute script 'xxxxx' due to unhandled exception!

查阅了很多资料都无法解决,网上大部分的解释是,路径中有中文,可是我的项目路径及python解释器的路径均不包含中文。
之后,为观察了mediapipe\python\solution_base.py脚本中的第247行,

validated_graph.initialize(
          binary_graph_path=os.path.join(root_path, binary_graph_path))

发现这里用到了root_path,向上查找,

root_path = os.sep.join(os.path.abspath(__file__).split(os.sep)[:-3])

发现报错原因,os.path.abspath(__file__)是获取当前脚本的路径,只有当在脚本中执行的时候,os.path.abspath(__file__)才会起作用,因为该命令是获取的当前执行脚本的完整路径,如果在交互模式或者terminate 终端中运行会报没有__file__这个错误。
找到原因后,就可以顺利解决问题了,python中获取exe所在目录的代码为:

os.path.dirname(sys.executable)

所以,解决该问题的方法是,将mediapipe\python\solution_base.py脚本中的第233行,改为

if getattr(sys, 'frozen', False):
    application_path = os.path.dirname(sys.executable)
elif __file__:
    application_path = os.sep.join(os.path.abspath(__file__).split(os.sep)[:-3])
root_path = application_path

代码修改后,使用pyinstaller进行打包,得到dist,build两个文件夹,运行dist文件夹下的exe文件,发现问题依然没有解决,这时,需要将python安装目录下的\Lib\site-packages目录中的mediapipe复制到dist文件夹下。
至此,该问题得以解决。

你可能感兴趣的:(问题解决,python,开发语言)