在 macOS 上使用 pyinstaller 编译 mediapipe 的问题
Issues compiling mediapipe with pyinstaller on macos
我在 macOS 上通过 pyinstaller 使用 mediapipe 编译项目时遇到问题
到目前为止我试过:
pyinstaller --windowed --noconsole pose_edge.py
pyinstaller --onefile --windowed --noconsole pose_edge.py
pyinstaller --noconsole pose_edge.py
.app 打不开,如果我尝试 unix exec,我得到
Traceback (most recent call last):
File "pose_edge.py", line 26, in <module>
File "mediapipe/python/solutions/selfie_segmentation.py", line 54, in __init__
File "mediapipe/python/solution_base.py", line 229, in __init__
FileNotFoundError: The path does not exist.
[36342] Failed to execute script pose_edge
我使用 conda,我的环境在 python 3.8,mediapipe 0.8.5 和 OSX 10.15.7
提前致谢
我 运行 也遇到过这个问题,几分钟前才弄明白 - 到目前为止,我正在以手动方式解决它,但我确信有一种惯用的方法可以做到它在 pyinstaller 中使用规范文件和数据导入。对于这个答案,我假设您没有为 pyinstaller 使用 --onefile
选项,而是在单个文件夹中创建二进制文件。
就是说,答案是 cp -r
安装在虚拟环境中的 mediapipe 的模块目录(或安装初始 mediapipe 包的任何地方,例如 /virtualenvs/pose_record-2bkqEH7-/lib/python3.9/site-packages/mediapipe/modules) 到您的 dist/main/mediapipe
目录中。这将使您捆绑的 mediapipe 库能够访问 binarypb 文件,我相信这些文件包含姿势检测算法的图形和权重。
更新: 我想出了一个更惯用的 pyinstaller 方法来 运行。在pyinstaller生成的.spec
文件中,可以通过以下方式自动添加文件:
在文件顶部,block_cipher = None
下,添加以下函数:
def get_mediapipe_path():
import mediapipe
mediapipe_path = mediapipe.__path__[0]
return mediapipe_path
然后,在下面几行之后:
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
添加以下利用 native Tree class to create a TOC for the binary 的行:
mediapipe_tree = Tree(get_mediapipe_path(), prefix='mediapipe', excludes=["*.pyc"])
a.datas += mediapipe_tree
a.binaries = filter(lambda x: 'mediapipe' not in x[0], a.binaries)
添加后,您可以从 CLI 运行 编译命令,例如:
pipenv run pyinstaller --debug=all main.spec --windowed --onefile
这使我能够构建一个适用于 mediapipe 的可执行文件。
我在 macOS 上通过 pyinstaller 使用 mediapipe 编译项目时遇到问题
到目前为止我试过:
pyinstaller --windowed --noconsole pose_edge.py
pyinstaller --onefile --windowed --noconsole pose_edge.py
pyinstaller --noconsole pose_edge.py
.app 打不开,如果我尝试 unix exec,我得到
Traceback (most recent call last):
File "pose_edge.py", line 26, in <module>
File "mediapipe/python/solutions/selfie_segmentation.py", line 54, in __init__
File "mediapipe/python/solution_base.py", line 229, in __init__
FileNotFoundError: The path does not exist.
[36342] Failed to execute script pose_edge
我使用 conda,我的环境在 python 3.8,mediapipe 0.8.5 和 OSX 10.15.7
提前致谢
我 运行 也遇到过这个问题,几分钟前才弄明白 - 到目前为止,我正在以手动方式解决它,但我确信有一种惯用的方法可以做到它在 pyinstaller 中使用规范文件和数据导入。对于这个答案,我假设您没有为 pyinstaller 使用 --onefile
选项,而是在单个文件夹中创建二进制文件。
就是说,答案是 cp -r
安装在虚拟环境中的 mediapipe 的模块目录(或安装初始 mediapipe 包的任何地方,例如 /virtualenvs/pose_record-2bkqEH7-/lib/python3.9/site-packages/mediapipe/modules) 到您的 dist/main/mediapipe
目录中。这将使您捆绑的 mediapipe 库能够访问 binarypb 文件,我相信这些文件包含姿势检测算法的图形和权重。
更新: 我想出了一个更惯用的 pyinstaller 方法来 运行。在pyinstaller生成的.spec
文件中,可以通过以下方式自动添加文件:
在文件顶部,block_cipher = None
下,添加以下函数:
def get_mediapipe_path():
import mediapipe
mediapipe_path = mediapipe.__path__[0]
return mediapipe_path
然后,在下面几行之后:
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
添加以下利用 native Tree class to create a TOC for the binary 的行:
mediapipe_tree = Tree(get_mediapipe_path(), prefix='mediapipe', excludes=["*.pyc"])
a.datas += mediapipe_tree
a.binaries = filter(lambda x: 'mediapipe' not in x[0], a.binaries)
添加后,您可以从 CLI 运行 编译命令,例如:
pipenv run pyinstaller --debug=all main.spec --windowed --onefile
这使我能够构建一个适用于 mediapipe 的可执行文件。