我正在eclipse中开发一个python pyqt程序,并尝试使用pyinstaller冻结我的代码。我在使用.db文件搁置时遇到了一些麻烦。我的麻烦是如何以这样的方式声明数据库文件的路径我可以在Eclipse和pyinstaller提供的可执行文件中运行该程序。
我的文件夹的结构如下(部分视图,因为有很多其他文件夹):
PROJEC_NAME
|
|____src
|
|__model
| |__model.py
| |__constants.py
|
|__db_example1.db
|__db_example2.db
|
|__main.py
在文件model / model.py中我的函数如下:
import model.constants as mcst
def f_example1():
self.session_base=shelve.open(mcst.EXAMPLE1_DB)
self.__session_list = list(self.session_base.keys())
self.session_list.sort()
self.session_base.close()
并且在model / constants.py中代码是这样的:
import os
(file_path,filename)=os.path.split(__file__)
db_path=os.path.join(file_path,'..')
EXAMPLE1_DB=os.path.join(db_path,'example1.db')
这一切在Eclipse中都很有效。
为了能够将.db文件与pyinstaller可执行文件一起使用,我使用PROJECT文件夹中的以下命令
pyinstaller -windowed --add-data src/*.db:. src/main.py
注意:我承认我还不了解-windowed选项的真正意义,但我认为此刻并不重要
不幸的是,运行pyinstaller生成的可执行文件会导致类似这样的错误:
File "model/Model.py", line 338, in f_example1
File "shelve.py", line 243, in open
File "shelve.py", line 227, in __init__
File "dbm/__init__.py", line 94, in open
_gdbm.error: [Errno 2] No such file or directory
我能设法让它在两种情况下工作的唯一方法是在model / model.py中使用它:
def f_example1():
self.session_base=shelve.open('example1.db')
self.__session_list = list(self.session_base.keys())
self.session_list.sort()
self.session_base.close()
,这在pyinstaller命令中:
pyinstaller -windowed --add-data src/*.db:. src/main.py
但这只有在我从dist / main / main目录启动pyinstaller生成的可执行文件时才有效:
./main
如果我从上层目录启动它,请说包含dist的目录:
dist/main/main
它适用于另一组.db文件。
我很感激帮助让程序始终在目标环境中使用相同的.db文件运行,无论我调用可执行文件的目录是什么,并继续使用Eclipse中的.db文件集。 我希望我的问题很清楚。