Невозможно импортировать opengl.gl в python на macos
Я использую OpenGL для рендеринга сцены на Python. Мой код отлично работает в Windows, но по какой-то причине у меня возникают проблемы при импорте opengl.gl в MacOS.
Проблема возникает при звонке from OpenGL.GL import ...
как в скриптах Python, так и в консоли Python.
Более конкретно, вот точный вызов в моем скрипте:
from OpenGL.GL import glGenBuffers, glBindBuffer, glBufferData, \
glGenVertexArrays, glBindVertexArray, glEnableVertexAttribArray, glVertexAttribPointer, \
glDrawArrays, glUseProgram, glEnable, glDisable, \
GL_ARRAY_BUFFER, GL_STATIC_DRAW, GL_DEPTH_TEST, \
GL_FLOAT, GL_FALSE, \
GL_TRIANGLES, GL_LINES, GL_LINE_STRIP
Это приводит к следующей ошибке:
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/darwin.py", line 35, in GL
return ctypesloader.loadLibrary(
File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/ctypesloader.py", line 36, in loadLibrary
return _loadLibraryWindows(dllType, name, mode)
File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/ctypesloader.py", line 89, in _loadLibraryWindows
return dllType( name, mode )
File "/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ctypes/__init__.py", line 373, in __init__
self._handle = _dlopen(self._name, mode)
OSError: ('dlopen(OpenGL, 10): image not found', 'OpenGL', None)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/iyadboustany/Desktop/lensmaster/Lensmaster.py", line 18, in <module>
from MainWindow import MainWindow
File "/Users/iyadboustany/Desktop/lensmaster/MainWindow.py", line 14, in <module>
from Robot import Robot
File "/Users/iyadboustany/Desktop/lensmaster/Robot.py", line 8, in <module>
from Graphics.Scene import DHNode
File "/Users/iyadboustany/Desktop/lensmaster/Graphics/Scene.py", line 13, in <module>
from OpenGL.GL import glGenBuffers, glBindBuffer, glBufferData, \
File "/usr/local/lib/python3.8/site-packages/OpenGL/GL/__init__.py", line 3, in <module>
from OpenGL import error as _error
File "/usr/local/lib/python3.8/site-packages/OpenGL/error.py", line 12, in <module>
from OpenGL import platform, _configflags
File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/__init__.py", line 36, in <module>
_load()
File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/__init__.py", line 33, in _load
plugin.install(globals())
File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/baseplatform.py", line 97, in install
namespace[ name ] = getattr(self,name,None)
File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/baseplatform.py", line 15, in __get__
value = self.fget( obj )
File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/darwin.py", line 62, in GetCurrentContext
return self.CGL.CGLGetCurrentContext
File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/baseplatform.py", line 15, in __get__
value = self.fget( obj )
File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/darwin.py", line 45, in CGL
def CGL(self): return self.GL
File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/baseplatform.py", line 15, in __get__
value = self.fget( obj )
File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/darwin.py", line 41, in GL
raise ImportError("Unable to load OpenGL library", *err.args)
ImportError: ('Unable to load OpenGL library', 'dlopen(OpenGL, 10): image not found', 'OpenGL', None)
Примечания:
- Запуск glxgears работает нормально.
- Я использую бета-версию macOS Big Sur (20A5343i)
- Я использую python 3.8.5
- Я установил opengl с помощью pip:
pip3 install PyOpenGL PyOpenGL_accelerate
Пожалуйста, порекомендуйте. Спасибо.
5 ответов
Эта ошибка возникает из-за того, что Big Sur больше не имеет библиотеки OpenGL или других системных библиотек в стандартных местах файловой системы и вместо этого использует кеш. PyOpenGL использует ctypes, чтобы попытаться найти библиотеку OpenGL, но не может ее найти. Исправление ctypes в Python, чтобы он обнаружил, что библиотека является предметом этого запроса на перенос
https://github.com/python/cpython/pull/21241
Так что будущая версия Python должна решить эту проблему.
Чтобы исправить это сейчас, вы можете отредактировать файл PyOpenGL OpenGL/platform/ctypesloader.py, изменив строку
fullName = util.find_library( name )
к
fullName = '/System/Library/Frameworks/OpenGL.framework/OpenGL'
Так как я ненавижу идею исправления пакета Python (плюс очень сложно справиться с этим с использованием Conda для установки указанного пакета), я предлагаю этот кладж в качестве обходного пути до тех пор, пока Python не получит свое обновление Big Sur (также известное как Big Nuisance):
try:
import OpenGL as ogl
try:
import OpenGL.GL # this fails in <=2020 versions of Python on OS X 11.x
except ImportError:
print('Drat, patching for Big Sur')
from ctypes import util
orig_util_find_library = util.find_library
def new_util_find_library( name ):
res = orig_util_find_library( name )
if res: return res
return '/System/Library/Frameworks/'+name+'.framework/'+name
util.find_library = new_util_find_library
except ImportError:
pass
Лучше изменить это на
fullName = "/System/Library/Frameworks/{}.framework/{}".format(name,name)
иначе GLUT не будет работать. По крайней мере, это позволило мне снова запустить 3D-материал Cozmo SDK.
К вашему сведению, в моем случае это было:
fullName = '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenGL.framework/OpenGL'
Ни один из этих ответов не очень подходит - было несколько проблем как с MacOS, так и с pyOpenGL.
Однако, к счастью, кажется, что все наконец-то работает, если мы обновимся до Python3.10 (или выше).