NoneType错误使用cx_Freeze将OpenGl脚本从.py转换为.exe

时间:2018-05-07 12:47:19

标签: python-3.x opengl cx-freeze

我有一些python脚本,我已经能够使用cx_Freeze相对轻松地转换为.exe但我已经使用opengl创建了一个rubixcube。

我有两个脚本;

import sys
from cx_Freeze import setup, Executable
#go to dir in cmd, run python setup.py build or; setup.py build... will create a folder build with name.exe
setup(
    name = "Cube",
    version = "1.1",
    description = "Cube",
    executables = [Executable("OwnCube.py", base = "Console")])

OwnCube.py很简单;

import pygame

from pygame.locals import *

from OpenGL.GL import *
from OpenGL.GLU import *

然后在“Cube”下保存一个构建文件夹,其中包含一个名为“OwnCube.exe”的.exe文件以及所有dll和数据文件。在cmd中运行OwnCube.exe会出现非类型错误。

G:\Programs\PersonalPrograms\PythonScripts\Cube\build\exe.win32-3.6>OwnCube.exe
Traceback (most recent call last):
  File "C:\Users\Alex\AppData\Local\Programs\Python\Python36-32\lib\site-packages\cx_Freeze\initscripts\__startup__.py", line 14, in run
    module.run()
  File "C:\Users\Alex\AppData\Local\Programs\Python\Python36-32\lib\site-packages\cx_Freeze\initscripts\Console.py", line 26, in run
    exec(code, m.__dict__)
  File "OwnCube.py", line 5, in <module>
  File "C:\Users\Alex\AppData\Local\Programs\Python\Python36-32\lib\site-packages\OpenGL\GL\__init__.py", line 3, in <module>
    from OpenGL import error as _error
  File "C:\Users\Alex\AppData\Local\Programs\Python\Python36-32\lib\site-packages\OpenGL\error.py", line 12, in <module>
    from OpenGL import platform, _configflags
  File "C:\Users\Alex\AppData\Local\Programs\Python\Python36-32\lib\site-packages\OpenGL\platform\__init__.py", line 35, in <module>
    _load()
  File "C:\Users\Alex\AppData\Local\Programs\Python\Python36-32\lib\site-packages\OpenGL\platform\__init__.py", line 29, in _load
    plugin = plugin_class()
TypeError: 'NoneType' object is not callable 

我已经和其他图书馆多次这样做了,但我似乎无法使用OpenGl,我错过了什么?

2 个答案:

答案 0 :(得分:2)

我也遇到了这个问题,为解决这个问题,我所做的就是在setup.py的OpenGL.platform.win32中添加includes。我用win10。 此错误的原因是:

def load( self ):
    """Attempt to load and return our entry point"""
    try:
        return **importByName**( self.import_path )
    except ImportError as err:
        return None
def importByName( fullName ):
    """Import a class by name"""
    name = fullName.split(".")
    moduleName = name[:-1]
    className = name[-1]
    module = __import__( ".".join(moduleName), {}, {}, moduleName)
    return getattr( module, className )`

cx_freeze无法在您的代码中捕获__import__,因此我们需要使用import而不是__import__

答案 1 :(得分:0)

经过多次拔毛。

原来我需要在设置中包含一个选项行以包含OpenGL库。然后我必须将环境变量设置为TCL_LIBRARY和TK_LIBRARY或手动。我在脚本中执行了以下操作:

import sys
import os
from cx_Freeze import setup, Executable



build_exe_options = {"includes": ["OpenGL"]}
os.environ['TCL_LIBRARY'] = r'G:\python path\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'G:\python path\tcl\tcl8.6'
#go to dir in cmd, run python setup.py build or; setup.py build... will create a folder build with name.exe
setup(
    name = "Cube",
    version = "1.1",
    description = "Cube",
    options = {"build_exe": {"packages": ["OpenGL"]}},
    executables = [Executable("OwnCube.py", base = "Console")]
    )

我真的不明白为什么会发生这种情况,我的猜测是,在将OpenGL库编译为.dll或.so文件时,它无法找到OpenGL在内部调用的库tkinter或tcl。

希望这有助于未来的搜索者。

相关问题