【问题标题】:Bundle sqldrivers into .exe using py2exe使用 py2exe 将 sqldrivers 捆绑到 .exe 中
【发布时间】:2014-06-30 15:42:56
【问题描述】:

在我的第一次尝试中,我与 py2exe 捆绑的 pyQt 应用程序拒绝连接到 sqlite 数据库,尽管它在其 python 版本中工作。 我猜这是没有加载到 .exe 应用程序中的库的问题。我通过将 sqlite DLL 的完整路径包含到 setup.py 文件中并因此将此 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,
)

【问题讨论】:

  • 所以你想只给用户一个可执行文件(没有依赖关系)?如果您使用的是 python 2.4 - 2.7,请查看 pyinstaller --onefile
  • 谢谢,我会看看这个。但是请理解 py2exe 已经具有我需要的选项('bundle_files': 1),通常只生成一个没有依赖关系的可执行文件。这里的问题是它自己没有找到对 sqlight 的依赖,所以我必须手动添加它,我不知道如何强制它进入包。

标签: python dll pyqt py2exe


【解决方案1】:

我遇到了同样的问题,而您已经解决了一半。问题的第一部分是您确定的,将文件放入 EXE。当我使用 pyinstaller 时,我无法说出您的 py2exe 解决方案的正确性,但这是一般的想法。您需要将 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)
 . . .

添加了日志记录后,这是我的 app.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 分隔符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 2014-01-26
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多