Adding a data file in Pyinstaller using the onefile option

后端 未结 4 1048
感情败类
感情败类 2020-12-05 20:37

I\'m trying to add an image to the one file produced by Pyinstaller. I\'ve read many questions/forums like this one and that one and still it\'s not working.

I know

相关标签:
4条回答
  • 2020-12-05 20:59

    I tried changed my python script's working directory, and it seems to work:

    import os 
    import sys
    
    os.chdir(sys._MEIPASS)
    os.system('included\\text.txt')
    

    my pyinstaller command:

    pyinstaller --onefile --nowindow --add-data text.txt;included winprint.py --distpath .
    
    0 讨论(0)
  • 2020-12-05 21:03

    I used a command prompt command instead of a .spec

    The command excludes shapely and then adds it back in (I guess this invokes a different import process). This shows how to add folders instead of just files.

    pyinstaller --clean --win-private-assemblies --onefile --exclude-module shapely --add-data C:\\Python27\\Lib\\site-packages\\shapely;.\\shapely --add-data C:\\Python27\\tcl\\tkdnd2.8;tcl main.py
    
    0 讨论(0)
  • 2020-12-05 21:09

    a simpler way of accessing the temp folder if by doing this:

    bundle_dir = getattr(sys, '_MEIPASS', path.abspath(path.dirname(__file__)))
    data_path = os.path.abspath(path.join(bundle_dir, 'data_file.dat'))
    

    Got it from read the docs

    0 讨论(0)
  • 2020-12-05 21:18

    When packaged to a single file with PyInstaller, running the .exe will unpack everything to a folder in your TEMP directory, run the script, then discard the temporary files. The path of the temporary folder changes with each running, but a reference to its location is added to sys as sys._MEIPASS.

    To make use of this, when your Python codes reads any file that will also be packaged into your .exe, you need to change the files location to be located under sys._MEIPASS. In other words, you need to add it to your python code.

    Here is an example that using the code from the link you referenced to adjust the file path to correct location when packaged to a single file.

    Example

    # data_files/data.txt
    hello
    world
    
    # myScript.py
    import sys
    import os
    
    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)
    
    def print_file(file_path):
        file_path = resource_path(file_path)
        with open(file_path) as fp:
            for line in fp:
                print(line)
    
    if __name__ == '__main__':
        print_file('data_files/data.txt')
    

    Running PyInstaller with the following options packages the file:

    pyinstaller --onefile --add-data="data_files/data.txt;data_files" myScript.py
    

    builds myScript.exe which runs correctly and can open and read the packaged data file.

    0 讨论(0)
提交回复
热议问题