使用py2exe生成的exe无法找到pywinauto

1 投票
1 回答
1961 浏览
提问于 2025-04-15 18:36

我一直在尝试用py2exe打包我的应用程序。这个应用程序运行得很好,但它总是找不到或无法使用pywinauto。我在网上搜索了很多,但什么都没找到,现在我完全迷茫了……

这是我的打包脚本:

from distutils.core import setup

setup(
  windows = ["mainForm.py"],
  data_files=[
      ('', ['mainForm.ui']),
      ('', ['osk.sqlite'])
  ],
  options = {
              "py2exe":{
                        "optimize": 2,
                        "includes": [
                          'sip', 'pyttsx.drivers.sapi5', 'win32com', 'xml.etree.ElementTree', 'sqlite3',
                          'pywinauto', 'pywinauto.application', 'pywinauto.controls', 'pywinauto.tests', 'SendKeys'
                            ],
                          "typelibs": [('{C866CA3A-32F7-11D2-9602-00C04F8EE628}', 0, 5, 0)]
                         }
              }
    )

这是运行exe时的输出:

Traceback (most recent call last):
  File "mainForm.py", line 129, in changeState
  File "mainForm.py", line 230, in setWriteMode
  File "mainForm.py", line 105, in FillApps
  File "WindowHandler.pyo", line 26, in getWindowList
NameError: global name 'pywinauto' is not defined

希望有人能给我指个方向。

提前谢谢大家!

1 个回答

1

根据我的经验,py2exe处理导入的方式有点奇怪。有时候它找不到相关的导入(比如你导入了WindowHandler,而WindowHandler又导入了pywinauto)。

我建议你在mainForm.py里先这样开始:

import sys
import WordOps 
import Voice 
import WindowHandler
from PyQt import QtCore, QtGui, uic

然后在setup.py里,先这样写:

options={'py2exe':{
                    'includes': ['sip'],
                    'bundle_files': 1
                  }
        }

确保你的程序在编译成exe之前能正常运行,然后再试着运行setup.py。当你在运行setup.py时开始遇到错误(比如你提到的那个),就往mainForm.py里添加更多的导入。针对那个错误,你的新开头应该是这样的:

import sys
import WordOps 
import Voice 
import WindowHandler
from PyQt import QtCore, QtGui, uic
# imports for py2exe
import pywinauto

这样做不会破坏你的代码,因为它只是一个“未使用”的导入。继续这样做,直到setup.py能正常工作为止。

撰写回答