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