Ошибка NoneType при преобразовании скрипта OpenGl из .py в .exe с помощью cx_Freeze - PullRequest
0 голосов
/ 07 мая 2018

У меня есть несколько сценариев Python, которые я смог относительно легко преобразовать в .exe с помощью cx_Freeze, но я столкнулся с проблемой с помощью rubixcube, который я создаю с помощью opengl.

У меня есть два сценария;

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» с файлом .exe с именем «OwnCube.exe» вместе со всеми файлами DLL и данными. Запуск OwnCube.exe в cmd приводит к ошибке, не связанной с типом.

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 голосов
/ 23 августа 2018

Я тоже столкнулся с этой проблемой, и все, что я сделал для решения этой проблемы, это добавление OpenGL.platform.win32 в includes файла setup.py. я использую 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__.

0 голосов
/ 08 мая 2018

После сильного потягивания волос.

Оказывается, мне нужно было включить строку параметров в настройку для включения библиотеки 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 он не может найти библиотеку tkinter или tcl, которую OpenGL вызывал внутри.

Надеюсь, это поможет будущим поисковикам.

...