#python #macos #opengl #pyopengl #macos-big-sur
#python #macos #opengl #pyopengl #macos-big-sur
Вопрос:
Я использую 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
Ответ №1:
Эта ошибка вызвана тем, что у 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'
Комментарии:
1. Где находится PyOpenGL?
2. Да, как бы мне получить доступ к файлу?
3. Как мне получить правильный путь к файлу для моего конкретного случая? Пожалуйста, посоветуйте
4. @JulianA. @yudhiesh @aeengineer вы можете найти файл по этому адресу
~/anaconda3/lib/python3.7/site-packages/OpenGL/platform/ctypesloader.py
или аналогичные пути к вашей установке python5. содержимое (базового) [~/Downloads /resources] $ ls /System /Library /Frameworks /OpenGL.framework / Libraries Версии ресурсов , <- это эти, и добавление этого пути к файлу не помогло, поскольку там не было папки OpenGL
Ответ №2:
Поскольку я ненавижу идею исправления пакета 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
Ответ №3:
Лучше изменить это на
fullName = "/System/Library/Frameworks/{}.framework/{}".format(name,name)
в противном случае GLUT не будет работать. По крайней мере, это позволило мне снова запустить 3D-материал Cozmo SDK.
Комментарии:
1. Действительно, исправлены мои проблемы.
Ответ №4:
К вашему сведению, в моем случае это было:
fullName = '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenGL.framework/OpenGL'
Ответ №5:
Ни один из этих ответов не является действительно подходящим — было несколько проблем как с macOS, так и с PyOpenGL.
К счастью, однако — все, кажется, наконец-то работает, если мы обновимся до Python3.10 (или выше)