我一直在努力为OSX El Capitan提供一个python可执行文件,并且我成功地使用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
如果有人能告诉我我做错了什么,或者给我一个解决方案,我将非常感激!