Как установить и запустить PostgreSQL как часть автономного приложения на основе Python? - PullRequest
0 голосов
/ 25 июня 2019

Я создал приложение Python, которое использует базу данных PostgreSQL, и теперь я хотел бы упаковать его как отдельное приложение. Я разработал, как упаковать все в один исполняемый файл, используя PyInstaller , однако при запуске при попытке установить соединение с базой данных, если он не существует, произойдет сбой при запуске. Чтобы решить эту проблему, я предполагаю, что мне нужно также включить механизм для установки и запуска экземпляра базы данных PostgreSQL, если он отсутствует.

Я пытаюсь обеспечить единый процесс установки, который создает / настраивает / запускает базу данных (если она отсутствует) и устанавливает исполняемый файл приложения. Я хочу создать установщики для Linux, Windows и MacOS.

Как мне лучше всего это сделать? Я надеюсь найти документацию для решения этого варианта использования - мой Google-Fu кажется слабым и / или решение неясно.

1 Ответ

1 голос
/ 26 июня 2019

Работа с внешним программным обеспечением не является целью Pyinstaller. Таким образом, вы должны справиться с этим самостоятельно, и это всегда зависит от зависимости. Что касается вашего вопроса, вам нужно сначала найти переносимую версию PostgreSQL, затем в вашем скрипте вам нужно запустить и настроить ее вручную. Например, в есть хорошая портативная версия . Просто извлеките содержимое PGRE portable в каталог PostgreSQL рядом с вашим скриптом Python (app.py). Затем вы можете использовать приведенный ниже код для запуска базы данных:

import subprocess
import os
import sys

PGRE_EXE = "PostgreSQL/PostgreSQLPortable.exe"


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)


def start_pgre():
    pgre_path = os.path.join(resource_path("."), PGRE_EXE)
    print(pgre_path)
    p = subprocess.Popen(
        [pgre_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = p.communicate()
    print(stdout)
    print(stderr)


if __name__ == "__main__":
    start_pgre()

Затем добавьте все PostgreSQL к данным, вы можете использовать ниже файл спецификации:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['app.py'],
             pathex=['<path to your root project>'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
a.datas += Tree('.\\PostgreSQL', prefix='PostgreSQL\\')
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='app',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=True )

Наконец, используйте pyinstaller <app.spec> для генерации вашего исполняемого файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...