使用py2exe将sqldrivers打包进.exe

2 投票
1 回答
522 浏览
提问于 2025-04-18 11:36

在我第一次尝试的时候,我的pyQt应用程序用py2exe打包后,虽然在Python版本中可以正常连接sqlite数据库,但打包后的程序却无法连接。我猜这可能是因为一些库没有加载到这个.exe应用程序里。我通过在setup.py文件中加入sqlite DLL的完整路径,解决了这个问题,这样就把这个DLL复制到了可执行文件的文件夹里。

现在我想把这个DLL直接包含进.exe文件里,这样就可以“隐藏”这个DLL,让用户看不见。 你知道怎么做吗?

我现在的setup.py文件:

from distutils.core import setup
import py2exe

setup(
  windows=[{
      "script": 'myscript.py'
  }],
  options={
      'py2exe': {
          "dll_excludes": [
              "MSVCP90.dll",
              "MSWSOCK.dll",
              "mswsock.dll",
              "powrprof.dll",
              ],

          'includes': [
              'sip',
              'PyQt4.QtNetwork',
              ],
         'bundle_files': 1,
      }
  },
  data_files = [
        'config.ini',
        'template.htm',

        # This is the File that I wish to be "hidden"
        ('sqldrivers', ('C:\Python27\Lib\site-packages\PyQt4\plugins\sqldrivers\qsqlite4.dll',)),

  zipfile=None,
)

1 个回答

0

我遇到了同样的问题,你已经找到了解决的一半。问题的第一部分就是你提到的,把文件放进EXE里。我不能确定你用py2exe的方法是否正确,因为我用的是pyinstaller,但大体思路是一样的。你需要把qsqlite4.dll放到你这个单文件应用程序的sqldrivers文件夹里。

第二部分是你的主.py文件需要添加路径,这样它的运行目录里就会有那个sqldrivers文件夹。你需要做的是获取主.py文件运行的相对路径,并把这个目录设置为你QT应用程序的库路径。我用的是pyinstaller的标准resource_path()函数,但用类似的方法应该也能在py2exe中工作:

def resource_path(relative_path)
    if sys.frozen:
        base_path = os.path.dirname(sys.executable)
    else:
        base_path = os.path.dirname(__file__)
    return os.path.join(base_path, relative_path)

然后你可以在应用程序的主函数中使用这段代码

app = QApplication(sys.argv)
new_lib_path = app.libraryPaths()
new_lib_path.append(resource_path(''))
app.setLibraryPaths(new_lib_path)
 . . .

加上日志记录后,这是我在应用程序中调用libraryPaths()之前和之后的结果:

08/25/2014 01:33:24 AM CRITICAL: Before[u'C:/dev/WORKSP~1/db/dist']
08/25/2014 01:33:24 AM CRITICAL: After[u'C:/dev/WORKSP~1/db/dist', u'C:\\Users\\jeff\\AppData\\Local\\Temp\\_MEI2042\\']

你可以把'\'替换成'/',不过我没这样做,使用Windows的分隔符也没问题。

撰写回答