如何作为基于Python的独立应用程序的一部分安装和启动PostgreSQL?

如何作为基于Python的独立应用程序的一部分安装和启动PostgreSQL?,postgresql,installation,pyinstaller,Postgresql,Installation,Pyinstaller,我已经创建了一个利用PostgreSQL数据库的Python应用程序,现在我想将其打包为一个独立的应用程序。我已经解决了如何将所有内容打包为一个单独的可执行文件,但是如果数据库不存在,那么在尝试建立到数据库的连接时,它将在启动时失败。为了解决这个问题,我的假设是,如果PostgreSQL数据库实例不存在,我还需要包括一个用于安装和启动它的机制 我试图提供一个单一的安装过程来创建/配置/启动数据库(如果不存在)并安装应用程序的可执行文件。我想为Linux、Windows和MacOS创建安装程序 我

我已经创建了一个利用PostgreSQL数据库的Python应用程序,现在我想将其打包为一个独立的应用程序。我已经解决了如何将所有内容打包为一个单独的可执行文件,但是如果数据库不存在,那么在尝试建立到数据库的连接时,它将在启动时失败。为了解决这个问题,我的假设是,如果PostgreSQL数据库实例不存在,我还需要包括一个用于安装和启动它的机制

我试图提供一个单一的安装过程来创建/配置/启动数据库(如果不存在)并安装应用程序的可执行文件。我想为Linux、Windows和MacOS创建安装程序


我最好怎么做?我希望能找到这个用例解决方案的文档——我的Google Fu似乎很弱,或者解决方案不明确。

处理外部软件不是Pyinstaller的目的。因此,您需要自己处理它的依赖关系。所以关于您的问题,您需要首先找到PostgreSQL的可移植版本,然后在脚本中手动运行和配置它。例如,在中有一个很好的可移植版本。 只需将PGRE-portable的内容提取到python脚本(
app.py
)旁边的类似于
PostgreSQL
的目录中。 然后,您可以使用以下代码启动数据库:

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
添加为外部数据,包括:

pyinstaller -F --add-data "./PostgreSQL:PostgreSQL" app.py