Pyinstaller 3使用--onefile添加数据文件

时间:2017-01-26 02:17:27

标签: python python-3.x executable pyinstaller

我有一个有效的Python 3脚本inventoryScraper.py,我正在努力将其作为我可以分发的1个文件可执行文件。我一直在使用Pyinstaller 3和Python 3,它在过去一直在使用。我有一个文件' Store_Codes.csv'我的脚本需要运行,我希望它包含在可执行文件中。

我已经阅读并尝试了所有以前与此相关的答案,但它没有奏效/我搞砸了。当Store_Codes.csv与exe在同一文件夹中时,生成的.exe工作,但不是。我绝对是Python的新手,但是我给予的人没有任何关于命令行或任何相关的经验,所以它很重要,它是一个多合一的文件。

我已经在其他帖子中看到的各种方式修改了spec文件,但没有一个有效,我确信我是误解,我真的可以使用帮助。

使用Pyinstaller 3,在onefile exe中包含数据文件的简单方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

  1. Store_Codes.csv放在与.py文件相同的文件夹中。
  2. 在.spec文件的data字段中添加datas=[( 'Store_Codes.csv', '.' )],
  3. 您应该添加到.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
    
  4. 编译文件。

  5. 讨论

    启动.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 -*-