如何使用 Pyinstaller - cx_Freeze executable sys.MEIPASS/sys.executable
How to use Pyinstaller - cx_Freeze executable sys.MEIPASS/sys.executable
我一直在努力让 python 可执行文件为 OSX El Capitan 工作,我成功地获得了使用 Pyinstaller 和 cx_Freeze 构建的可执行文件,问题出现在我实际上 运行 另一个 mac 上的可执行文件。我得到的错误是关于无法找到我的主脚本中引用的 .db 文件,所以我查看了这两个程序的文档并遇到了 sys.MEIPASS (Pyinstaller) 和 sys.executable (cx_Freeze) 将数据文件包含在 --onefile 应用程序中。这是我在主脚本中使用的代码:
def find_data_file(filename):
if getattr(sys, 'frozen', False):
# The application is frozen
datadir = os.path.dirname(sys._MEIPASS) #in cx_Freeze this is sys.executable
else:
# The application is not frozen
# Change this bit to match where you store your data files:
datadir = ospath.abspath(os.pardir)
return os.path.join(datadir, filename)
#This is how im using the "find_data_file" function in my code.
dbpath = find_data_file('PubData.db')
conn = lite.connect(dbpath)
我在 else 语句中稍微更改了它以匹配我的项目目录的布局,并且在 运行 解冻应用程序时它工作得很好。
然而,当我尝试 运行 使用构建的可执行文件时,它给我一个关于无法找到 .db 文件的错误,我认为引用 sys.MEIPASS 或 sys.executable 会修复。
错误:
Traceback (most recent call last):
File "interface/GUI.py", line 673, in <module>
File "interface/GUI.py", line 82, in __init__
File "interface/GUI.py", line 212, in getServerNames
sqlite3.OperationalError: no such table: servernames
这是我的文件树的样子:
PubData-master ##(Project Root Directory)
Interface ##(Directory)
GUI.py ##(Main Script, this is where i reference 'PubData.db')
GUI.spec ##(Pyinstaller spec file)
PubData.db ## This is my database file, in the PubData-master Directory
如果有人能告诉我我做错了什么,或者给我一个解决方案,我将不胜感激!
如果您尝试访问您在 .spec 文件中指定的任何数据文件,在您的代码中,您必须使用 Pyinstaller 的 _MEIPASS 文件夹来引用您的文件。以下是我如何处理名为 Data.db:
的文件
import sys
import os.path
if hasattr(sys, "_MEIPASS"):
datadir = os.path.join(sys._MEIPASS, 'Data.db')
else:
datadir = 'Data.db'
conn = lite.connect(datadir)
这替换了以下单行:
conn = lite.connect("Data.db")
这个link解释的很好:
https://irwinkwan.com/2013/04/29/python-executables-pyinstaller-and-a-48-hour-game-design-compo/
我一直在努力让 python 可执行文件为 OSX El Capitan 工作,我成功地获得了使用 Pyinstaller 和 cx_Freeze 构建的可执行文件,问题出现在我实际上 运行 另一个 mac 上的可执行文件。我得到的错误是关于无法找到我的主脚本中引用的 .db 文件,所以我查看了这两个程序的文档并遇到了 sys.MEIPASS (Pyinstaller) 和 sys.executable (cx_Freeze) 将数据文件包含在 --onefile 应用程序中。这是我在主脚本中使用的代码:
def find_data_file(filename):
if getattr(sys, 'frozen', False):
# The application is frozen
datadir = os.path.dirname(sys._MEIPASS) #in cx_Freeze this is sys.executable
else:
# The application is not frozen
# Change this bit to match where you store your data files:
datadir = ospath.abspath(os.pardir)
return os.path.join(datadir, filename)
#This is how im using the "find_data_file" function in my code.
dbpath = find_data_file('PubData.db')
conn = lite.connect(dbpath)
我在 else 语句中稍微更改了它以匹配我的项目目录的布局,并且在 运行 解冻应用程序时它工作得很好。 然而,当我尝试 运行 使用构建的可执行文件时,它给我一个关于无法找到 .db 文件的错误,我认为引用 sys.MEIPASS 或 sys.executable 会修复。
错误:
Traceback (most recent call last):
File "interface/GUI.py", line 673, in <module>
File "interface/GUI.py", line 82, in __init__
File "interface/GUI.py", line 212, in getServerNames
sqlite3.OperationalError: no such table: servernames
这是我的文件树的样子:
PubData-master ##(Project Root Directory)
Interface ##(Directory)
GUI.py ##(Main Script, this is where i reference 'PubData.db')
GUI.spec ##(Pyinstaller spec file)
PubData.db ## This is my database file, in the PubData-master Directory
如果有人能告诉我我做错了什么,或者给我一个解决方案,我将不胜感激!
如果您尝试访问您在 .spec 文件中指定的任何数据文件,在您的代码中,您必须使用 Pyinstaller 的 _MEIPASS 文件夹来引用您的文件。以下是我如何处理名为 Data.db:
的文件import sys
import os.path
if hasattr(sys, "_MEIPASS"):
datadir = os.path.join(sys._MEIPASS, 'Data.db')
else:
datadir = 'Data.db'
conn = lite.connect(datadir)
这替换了以下单行:
conn = lite.connect("Data.db")
这个link解释的很好: https://irwinkwan.com/2013/04/29/python-executables-pyinstaller-and-a-48-hour-game-design-compo/