我有一个有效的Python 3脚本inventoryScraper.py,我正在努力将其作为我可以分发的1个文件可执行文件。我一直在使用Pyinstaller 3和Python 3,它在过去一直在使用。我有一个文件' Store_Codes.csv'我的脚本需要运行,我希望它包含在可执行文件中。
我已经阅读并尝试了所有以前与此相关的答案,但它没有奏效/我搞砸了。当Store_Codes.csv与exe在同一文件夹中时,生成的.exe工作,但不是。我绝对是Python的新手,但是我给予的人没有任何关于命令行或任何相关的经验,所以它很重要,它是一个多合一的文件。
我已经在其他帖子中看到的各种方式修改了spec文件,但没有一个有效,我确信我是误解,我真的可以使用帮助。
使用Pyinstaller 3,在onefile exe中包含数据文件的简单方法是什么?
谢谢!
答案 0 :(得分:1)
Store_Codes.csv
放在与.py文件相同的文件夹中。 data
字段中添加datas=[( 'Store_Codes.csv', '.' )],
您应该添加到.py文件
if getattr(sys, 'frozen', False):
# if you are running in a |PyInstaller| bundle
extDataDir = sys._MEIPASS
extDataDir = os.path.join(extDataDir, 'Store_Codes.csv')
#you should use extDataDir as the path to your file Store_Codes.csv file
else:
# we are running in a normal Python environment
extDataDir = os.getcwd()
extDataDir = os.path.join(extDataDir, 'Store_Codes.csv')
#you should use extDataDir as the path to your file Store_Codes.csv file
编译文件。
启动.exe
时,它会在操作系统的相应临时文件夹位置创建一个临时文件夹。该文件夹名为_MEIxxxxxx
,其中xxxxxx是随机数。运行脚本所需的所有文件都在那里
sys._MEIPASS
是此临时文件夹的路径。
将datas=[( 'Store_Codes.csv', '.' )]
添加到spec文件中时。它会将文件复制到捆绑包的主文件夹中。如果你想让它保持井然有序,你可以使用datas=[( 'Store_Codes.csv', 'another_folder' )]
创建一个不同的文件夹,然后在你的代码中你会有
if getattr(sys, 'frozen', False):
# if you are running in a |PyInstaller| bundle
extDataDir = sys._MEIPASS
extDataDir = os.path.join(extDataDir,another_folder, 'Store_Codes.csv')
#you should use extDataDir as the path to your file Store_Codes.csv file
else:
# we are running in a normal Python environment
extDataDir = os.getcwd()
extDataDir = os.path.join(extDataDir,another_folder 'Store_Codes.csv')
#you should use extDataDir as the path to your file Store_Codes.csv file
答案 1 :(得分:0)
实际上这是最简单的解决方法,将Store_Codes.csv
重命名为Store_Codes.py
然后编辑文件:
csv_codes = """
csv file content...
"""
在您的主脚本中:import Store_Codes
然后csv_file_content = Store_Codes.csv_codes
。
然后在pyinstaller
中使用--onefile
,它会自动将Store_Codes.py
包含在新生成的exe文件中。
P.S。如果csv文件中有utf-8
个编码内容,请不要忘记# -*- coding: utf-8 -*-