首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >冻结(.exe)一个traitsUI程序,实际可行吗?

冻结(.exe)一个traitsUI程序,实际可行吗?
EN

Stack Overflow用户
提问于 2015-01-22 01:12:55
回答 1查看 1.4K关注 0票数 3

我正试图用cx_freeze或pyInstaller来冻结一个利用查科、特征、TraitsUI的TraitsUI程序,并在较小的程度上使用mayavi (实际上可以删除)。我需要在mac,linux,ubuntu上运行,这样就可以避免使用py2exe了。我有意卸载pyqt和pyside,以便只有wx后端可用。

使用cx_freeze,我遇到并报告了一个bug,所以pyInstaller似乎让我得到了最大的帮助。它生成一个.exe文件,但当我运行该文件时,会收到警告和一个错误。为了生成.exe文件,我这样做了:

代码语言:javascript
复制
pyinstaller --onefile --name=pameapp pamemain.py 
pyinstaller pameapp.exe

在运行时,警告如下:

代码语言:javascript
复制
Warning: Unable to import the wx backend for pyface due to traceback: Traceback (most recent call last):
      File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/pyface.toolkit", line 45, in _init_toolkit
      File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/pyface.toolkit", line 31, in import_toolkit
    ImportError: No module named wx.init

Warning: Unable to import the qt4 backend for pyface due to traceback: Traceback (most recent call last):
      File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/pyface.toolkit", line 45, in _init_toolkit
      File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/pyface.toolkit", line 31, in import_toolkit
    ImportError: No module named init

Warning: Unable to import the null backend for pyface due to traceback: Traceback (most recent call last):
      File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/pyface.toolkit", line 45, in _init_toolkit
      File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/pyface.toolkit", line 31, in import_toolkit
    ImportError: No module named null.init

此外,我还得到以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "<string>", line 8, in <module>
  File "/home/glue/anaconda/envs/fibersim/lib/python2.7/site-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traitsui.api", line 35, in <module>
  File "/home/glue/anaconda/envs/fibersim/lib/python2.7/site-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traitsui.editors", line 22, in <module>
  File "/home/glue/anaconda/envs/fibersim/lib/python2.7/site-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traitsui.editors.api", line 10, in <module>
  File "/home/glue/anaconda/envs/fibersim/lib/python2.7/site-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traitsui.editors.code_editor", line 36, in <module>
  File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traitsui.editors.code_editor", line 48, in ToolkitEditorFactory
  File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traits.traits", line 487, in __call__
  File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traits.traits", line 1191, in Color
  File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traitsui.toolkit_traits", line 7, in ColorTrait
  File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traitsui.toolkit", line 137, in toolkit
traits.trait_errors.TraitError: Could not find any UI toolkit called 'null'

pyface可能有很多动态导入,所以这肯定是任何试图冻结ETS的人都会遇到的问题。有什么办法可以解决这个问题吗?

考虑到在网上流传的旧东西的成功率,冻结一个ETS项目,它是否值得进一步的投资?对我们来说,让人们避免为这个应用程序配置python将是一个巨大的好处。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-01-24 13:24:21

您使用的Pyface.toolkit使用的是动态导入:

代码语言:javascript
复制
def import_toolkit(tk):
    try:
        # Try and import the toolkit's pyface backend init module.
        be = 'pyface.ui.%s.' % tk
        __import__(be + 'init')
    except:
        raise
    return be

因此,pyinstaller无法检测到这一点。使用python -v b.py 2>&1 | grep imp检查什么是特定的导入,并添加带有适当hiddenimports列表的钩子文件(钩子-..py)。

但是,我已经在本地进行了一些测试,并且无法使用__import__进行工作测试模式。这很奇怪,因为我做了一些调试,我发现隐藏导入是添加的,但仍然不能使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28079792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档