Pyinstaller 是否能够将 .py 文件与音频一起转换为 exe?
Is Pyinstaller able to convert .py file to exe together with audio?
我创建了一个虚拟助手,它可以帮我在线搜索东西、打开特定网站、打开应用程序,如 word、powerpoint 等。在 Windows 10 上使用 Python 3.6。
我已成功将其转换为 .exe 文件,并且可以顺利 运行ning 但它无法播放我的代码中包含的声音片段。在将声音转换为 exe 之前,我将声音放在与代码相同的目录中。当您尝试以管理员身份 运行 应用程序时,它没有播放声音,而是被 windows 的声音所取代(我希望这确实有意义)。
有什么办法可以解决这个问题,或者 Pyinstaller 可以将我的代码与音频混合吗?感谢您的帮助!
除了重新转换它之外,我从未尝试过任何其他方法,因为从目录中删除音频文件没有任何意义。
这是我的代码中播放声音的部分。如果你们中的任何人 wants/needs 看到我的整个代码(它有 500 行)请告诉我,我会提供它。
elif "toss a coin" in recog1.recognize_google(audio, language="en-US"):
coin = ["HEADS", "TAILS"]
engine.say("Tossing a coin...")
engine.runAndWait()
winsound.PlaySound("coin_toss.wav", winsound.SND_FILENAME)
engine.say("The coin toss shows" + random.choice(coin))
engine.runAndWait()
elif "roll a die" in recog1.recognize_google(audio, language="en-US"):
engine.say("Rolling a die")
engine.runAndWait()
winsound.PlaySound("roll_die", winsound.SND_FILENAME)
engine.say("The die result shows " + str(random.randint(0, 6)))
engine.runAndWait()
当我 运行 在我的 IDE (Pycharm) 上运行它时,它可以完美地工作,但是当我在命令行上 运行 它时,它 运行也是,但音频不工作。
PyInstaller 不会做这样的事情。您需要手动提供声音文件。首先,您需要使用 add-data
标志将您的声音文件添加到输出可执行文件,然后创建一个函数以从提取的路径加载您的文件。
请记住,我正在使用 resource_path
函数加载声音文件。将歌曲文件放在脚本文件旁边。
import os
import sys
def resource_path(relative_path):
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)
...
elif "toss a coin" in recog1.recognize_google(audio, language="en-US"):
coin = ["HEADS", "TAILS"]
engine.say("Tossing a coin...")
engine.runAndWait()
winsound.PlaySound(resource_path("coin_toss.wav"), winsound.SND_FILENAME)
engine.say("The coin toss shows" + random.choice(coin))
engine.runAndWait()
elif "roll a die" in recog1.recognize_google(audio, language="en-US"):
engine.say("Rolling a die")
engine.runAndWait()
winsound.PlaySound(resource_path("roll_die"), winsound.SND_FILENAME)
engine.say("The die result shows " + str(random.randint(0, 6)))
engine.runAndWait()
...
并生成您的可执行文件:
pyinstaller -F --add-data "path/to/coin_toss.wav;." --add-data "path/to/roll_die;." script.py
我创建了一个虚拟助手,它可以帮我在线搜索东西、打开特定网站、打开应用程序,如 word、powerpoint 等。在 Windows 10 上使用 Python 3.6。 我已成功将其转换为 .exe 文件,并且可以顺利 运行ning 但它无法播放我的代码中包含的声音片段。在将声音转换为 exe 之前,我将声音放在与代码相同的目录中。当您尝试以管理员身份 运行 应用程序时,它没有播放声音,而是被 windows 的声音所取代(我希望这确实有意义)。 有什么办法可以解决这个问题,或者 Pyinstaller 可以将我的代码与音频混合吗?感谢您的帮助!
除了重新转换它之外,我从未尝试过任何其他方法,因为从目录中删除音频文件没有任何意义。
这是我的代码中播放声音的部分。如果你们中的任何人 wants/needs 看到我的整个代码(它有 500 行)请告诉我,我会提供它。
elif "toss a coin" in recog1.recognize_google(audio, language="en-US"):
coin = ["HEADS", "TAILS"]
engine.say("Tossing a coin...")
engine.runAndWait()
winsound.PlaySound("coin_toss.wav", winsound.SND_FILENAME)
engine.say("The coin toss shows" + random.choice(coin))
engine.runAndWait()
elif "roll a die" in recog1.recognize_google(audio, language="en-US"):
engine.say("Rolling a die")
engine.runAndWait()
winsound.PlaySound("roll_die", winsound.SND_FILENAME)
engine.say("The die result shows " + str(random.randint(0, 6)))
engine.runAndWait()
当我 运行 在我的 IDE (Pycharm) 上运行它时,它可以完美地工作,但是当我在命令行上 运行 它时,它 运行也是,但音频不工作。
PyInstaller 不会做这样的事情。您需要手动提供声音文件。首先,您需要使用 add-data
标志将您的声音文件添加到输出可执行文件,然后创建一个函数以从提取的路径加载您的文件。
请记住,我正在使用 resource_path
函数加载声音文件。将歌曲文件放在脚本文件旁边。
import os
import sys
def resource_path(relative_path):
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)
...
elif "toss a coin" in recog1.recognize_google(audio, language="en-US"):
coin = ["HEADS", "TAILS"]
engine.say("Tossing a coin...")
engine.runAndWait()
winsound.PlaySound(resource_path("coin_toss.wav"), winsound.SND_FILENAME)
engine.say("The coin toss shows" + random.choice(coin))
engine.runAndWait()
elif "roll a die" in recog1.recognize_google(audio, language="en-US"):
engine.say("Rolling a die")
engine.runAndWait()
winsound.PlaySound(resource_path("roll_die"), winsound.SND_FILENAME)
engine.say("The die result shows " + str(random.randint(0, 6)))
engine.runAndWait()
...
并生成您的可执行文件:
pyinstaller -F --add-data "path/to/coin_toss.wav;." --add-data "path/to/roll_die;." script.py