无法使用auto-py-to-exe包含ffmpeg.exe
我正在尝试为我的PyQT应用程序生成一个exe文件,这个应用程序使用了auto-py-to-exe来打包。
在这个应用程序中,有一些地方调用了ffmpeg作为操作系统命令(比如 'ffmpeg -i file ... output')。因为我在我的电脑上安装了ffmpeg,并且它可以通过Windows的路径访问,所以当我在自己的电脑上运行这个exe文件时,没有任何问题。
但是,如果是其他没有安装ffmpeg的人,他们就会遇到一个错误,提示类似于“'ffmpeg' 不是内部或外部命令,也不是可运行的程序或批处理文件”。
我不想把ffmpeg放在应用程序的文件夹里,因为我调用的本地模块已经在使用ffmpeg作为操作系统命令。
我首先尝试将ffmpeg.exe作为文件添加(这是在一个StackOverflow帖子中推荐的),然后尝试作为二进制文件,但都没有成功。
我已经尝试了这个配置。
有没有人能帮我解决这个问题?
编辑 N°2
结果发现,当我在自己的电脑上导出exe文件并将ffmpeg作为二进制文件包含时,无论是使用pyinstaller还是auto-py-to-exe,最终的exe文件都无法识别ffmpeg命令,即使它在文件夹里。
不过,我在另一台机器上尝试了相同的配置,结果没有任何错误。
我还尝试安装了另一个版本的ffmpeg,并将这个版本链接到最终的exe文件,但也没有成功。
1 个回答
对我有帮助的回答可以在 这里 找到。我把 ffmpeg.exe 放到了根目录的二进制文件里,并且把它作为额外文件添加到了根目录。
--add-data "D:/sdw/ffmpeg/ffmpeg.exe;." --add-binary "D:/sdw/ffmpeg/ffmpeg.exe;."
然后在代码中,你需要用绝对路径来调用 ffmpeg -i... 的内容,就像上面回答中强调的那样。
def resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
所以 subprocess.run 的用法大概是这样的:
subprocess.run(resource_path('ffmpeg -i .... ')
这对我来说是有效的,不过我只是个新手,在做一个小项目,所以希望这至少能给你指个方向。