我花了几天时间研究这个问题,但无法弄清楚。我为 ffmpeg 进程创建了一个 py2app GUI 包装器,我每天将其用作 Python tkinter 界面。整个项目是用绝对路径编写的,并且在从终端启动应用程序时完美运行(.app > Contents > MacOS ..)。否则,除了 ffmpeg 功能之外的所有功能在通过打开 .app 启动时都可以工作。我担心的是,当从终端启动时,调用 ffmpeg 的函数只是使用终端,因此我的计算机的系统路径来调用 ffmpeg。
我尝试做什么:
在我的 setup.py 文件中,我添加了一行,其中包含 ffmpeg 的位置 -
OPTIONS = {'iconfile':'T2.icns','plist': {'CFBundleShortVersionString':'0.1.0',},'frameworks':['/usr/local/Cellar/ffmpeg/5.0/bin/ffmpeg'],}
仅此并不能解决问题。所以我尝试修改我调用ffmpeg的部分。我尝试使用一些不同的选项,
os.system('ffmpeg...')
subprocess.Popen('ffmpeg...', shell=True).wait()
我还尝试了 py2app 文档第 17 页第 1.11.8 节中提到的一些内容,尽管我不确定我做对了:
subprocess.Popen("@executable_path/Contents/Frameworks/ffmpeg..., shell=True).wait()
此时我不知道我还能尝试什么。我的最终目标是能够将其保存在闪存驱动器上,并在我需要使用它的任何 Mac 上运行它,无论它是否安装了 Python 或 ffmpeg。
提前致谢!
这是一个老问题,但仍然时不时地出现。我在这里发布我的答案,因为这似乎是有关该问题的最新问题。
当您通过在终端中打开它的包中的可执行文件运行应用程序时,它会继承所有“您的”环境变量,包括 PATH。当您通过应用程序运行它时,它没有这些。 解决方案是在应用程序/脚本的早期启动时将
/usr/local/bin
添加到 PATH 环境变量。
# Add to search path
search_path = ['/usr/local/bin']
for path in search_path:
os.environ['PATH'] += f':{path}'
这样,您的捆绑应用程序将能够找到 ffmpeg 库(或 tesseract,或使用
subprocess
调用的任何其他内容)。