Объединение файлов .py и .txt в файл .exe с помощью pyinstaller - PullRequest
3 голосов
/ 20 октября 2019

У меня есть программа на Python, которая принимает в качестве входных данных два текстовых файла. Я преобразовал эту программу Python (файл .py) в файл .exe, используя pyinstaller. Файл .exe при запуске выдает FileNotFoundError. Но когда файл .txt копируется в путь, где присутствует .exe, он работает нормально. Мое намерение состоит в том, чтобы не копировать файл .txt, а связать файл .txt вместе с .exe, чтобы файл .txt был недоступен. Все зависимости .txt файла, которые я хочу связать с .exe, в конечном счете, должен быть только один файл .exe, когда я его запускаю, он должен работать так же, как когда я запускаю программу python. Пожалуйста, предложите мне способы достижения того же

Я новичок в pyinstaller. Я пытался добавить файлы .txt к параметру данных в файле .spec. Но это не в состоянии скопировать текстовые файлы в папку dist, где присутствует мой .exe. Но, как я уже говорил, мне нужен только файл .exe. Даже если файл .exe предоставлен кому-то другому, у которого нет доступа ни к одному из текстовых файлов, файл .exe должен запускаться без ошибок

a.datas + = [('D: / Trial / src / readme_text_files/readme1. 1005 *

Приведенный выше код был добавлен в файл .spec, в результате я предполагаю, что файлы readme_text_files должны быть скопированы в папку, где присутствует .exe при запуске: pyinstaller spec_filename.spec

1 Ответ

0 голосов
/ 20 октября 2019

Я хотел, чтобы файл .txt был связан с файлом .exe, поэтому я сделал следующее:

  1. Я отредактировал файл .spec следующим образом:

    a = Analysis(['mainProgram_edited_for_datas.py'],
             pathex=['D:\\Trial\\src'],
             binaries=[],
             datas=[
             ('D:/Trial/src/readme_text_files/readme1.txt','readme_text_files'),
             ('D:/Trial/src/readme_text_files/readme2.txt','readme_text_files'),
             ], ...........(Rest of the .spec file contents as it is)
    

    Или просто вы можете напрямую включить сам каталог, как показано ниже:

    datas=[('C:/Users/njv5kor/eclipse-workspace/Trial/src/readme_text_files/','readme_text_files'),
                        ],
    
  2. В коде Python я добавил следующий код:

    def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    try: 
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")
    
    return os.path.join(base_path, relative_path)
    
    file = resource_path("readme_text_files\\readme1.txt")
    

По сути, pyinstaller связывает файлы .txt с файлом .py и создает один файл .exe. Подробнее о _MEIPASS см. Ссылку: https://pyinstaller.readthedocs.io/en/v3.3.1/operating-mode.html#how-the-one-file-program-works

...