Что нужно wxPython для успешной работы?

Я пытаюсь заставить wxPython работать в виртуальной среде на основе pyenv с плагинами virtualenv и virtualenvwrapper в MacOS. Я прочитал несколько вопросов о том, как это сделать, но большинство ответов, похоже, предполагают, что я использую системную версию Python и/или обращаюсь только к одному аспекту неработающей установки. Я еще не видел ничего, что объясняло бы, что проверяет wxPython при запуске.

У меня есть Python 3.7, скомпилированный pyenv с --enable-framework.

env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.7.4

Сам pyenv установлен в моем домашнем каталоге из достаточно недавнего (за последние пару недель) извлечения из git.

Чтобы было ясно, Homebrew не устанавливает ни один из инструментов или библиотек в моей цепочке инструментов Python.

Мой virtualenv имеет доступ к фреймворку благодаря --system-site-packages. Имея доступ к фреймворку и дисплею, предположительно, все, что требуется для работы wxPython, тем не менее я все еще получаю ту же ошибку при запуске любого тестового приложения:

Этой программе нужен доступ к экрану. Пожалуйста, запускайте со сборкой Python Framework и только тогда, когда вы вошли в систему на главном дисплее вашего Mac.

Мне кажется, что все, что мне нужно, доступно.

% pyenv which python3.7
/Users/matt/.pyenv/versions/3.7.4/bin/python3.7

% mkvirtualenv --system-site-packages --python python3.7 wxtest
Running virtualenv with interpreter /Users/matt/.pyenv/shims/python3.7
Already using interpreter /Users/matt/.pyenv/versions/3.7.4/Python.framework/Versions/3.7/bin/python3.7
Using base prefix '/Users/matt/.pyenv/versions/3.7.4/Python.framework/Versions/3.7'
New python executable in /Users/matt/.ve/wxtest/bin/python3.7
Also creating executable in /Users/matt/.ve/wxtest/bin/python
Installing setuptools, pip, wheel...
done.
virtualenvwrapper.user_scripts creating /Users/matt/.ve/wxtest/bin/predeactivate
virtualenvwrapper.user_scripts creating /Users/matt/.ve/wxtest/bin/postdeactivate
virtualenvwrapper.user_scripts creating /Users/matt/.ve/wxtest/bin/preactivate
virtualenvwrapper.user_scripts creating /Users/matt/.ve/wxtest/bin/postactivate
virtualenvwrapper.user_scripts creating /Users/matt/.ve/wxtest/bin/get_env_details

% python -m site
sys.path = [
    '/Users/matt/devel/wxtest',
    '/Users/matt/.ve/wxtest/lib/python37.zip',
    '/Users/matt/.ve/wxtest/lib/python3.7',
    '/Users/matt/.ve/wxtest/lib/python3.7/lib-dynload',
    '/Users/matt/.pyenv/versions/3.7.4/Python.framework/Versions/3.7/lib/python3.7',
    '/Users/matt/.ve/wxtest/lib/python3.7/site-packages',
    '/Users/matt/.pyenv/versions/3.7.4/Python.framework/Versions/3.7/lib/python3.7/site-packages',
]
USER_BASE: '/Users/matt/.local' (exists)
USER_SITE: '/Users/matt/.local/lib/python3.7/site-packages' (doesn't exist)
ENABLE_USER_SITE: True

% pip install wxPython
Collecting wxPython
[...]
Successfully installed numpy-1.18.0 pillow-6.2.1 six-1.13.0 wxPython-4.0.7.post2

Код для IsDisplayAvailable() скрыт в общей библиотеке объектов _core, поэтому его не так-то просто изучить. Я не кодер на C++, и все, что мне удалось найти в репозитории кода, это строка документации в src/_app.i, а не фактический код.

  • В Mac OS X возвращаемое значение False будет означать, что wx не может получить доступ к диспетчеру окон, что может произойти при удаленном входе в систему или при запуске из обычной версии python вместо версии фреймворка (т. е. pythonw.)

Этот список требований, кажется, удовлетворяется тем, что у меня есть здесь. У меня нет двоичного файла pythonw, но, как сказано на странице руководства pythonw(1):

На самом деле, начиная с Python 2.5, обычный python также позволяет доступ к графическому интерфейсу, поэтому python и pythonw теперь взаимозаменяемы.

Есть ли у кого-нибудь исчерпывающий список того, что wxPython на самом деле ожидает найти перед запуском?


person mpounsett    schedule 22.12.2019    source источник


Ответы (2)


Ошибка, с которой вы столкнулись, скорее всего, является «варочной дырой» (также известной как проблема установки/совместимости доморощенного для wxpython v3, а иногда и v4).

Чтобы проверить некоторые проблемы, которые могут возникнуть, выполните в своем pyenv следующее:

  1. python --version
  2. python3 --version

Как они устанавливаются? Вы использовали пиво?

  1. Если варева или любой не анаконды: удалить все.

  2. Затем: переустановите python через упакованную версию anaconda 2019. (xx > 04), и она даст вам 3.7.4 или 3.7.5 в зависимости от того, что вы выберете.

  3. переустановите через conda/pip cmd-line необходимые пакеты, которые не установлены по умолчанию.

«База» Anaconda — это ваша среда по умолчанию.

  1. Затем conda create --name myenv, где myenv — это любое имя, которое вы даете своей среде. Например, среда «myPythonwx408».
  2. командная строка: conda activate myenv

...и тада.. вставай...

Если ошибка сохраняется в anaconda env, вы можете опубликовать файл environment.yml, чтобы я мог воссоздать вашу среду для тестирования.

person ZF007    schedule 29.12.2019
comment
Все мои версии Python устанавливаются с помощью penv (т.е. env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.7.4. Я обновляю вопрос, чтобы устранить эту двусмысленность. Ни один из задействованных инструментов не устанавливается с помощью brew. Что насчет anaconda даст мне то, что компиляция python самостоятельно (через pyenv) с --enable-framework не будет? - person mpounsett; 30.12.2019
comment
Я также должен отметить, что это не отвечает на основной вопрос о том, что на самом деле нужно wxPython для успешной работы. - person mpounsett; 30.12.2019
comment
Основная проблема описана на wxpython [wiki.wxpython.org/wxPythonVirtualenvOnMac], и даже они не не знаю точно, в чем именно проблема. Их ответ: Причина в том, что некоторые сторонние инструменты, такие как PyInstaller, могут потребовать установки CPython с --enable-framework. Вы пробовали их ответ, чтобы обойти это, и все еще не работает. Опубликованное решение - это то, как я справился с тем, чтобы тратить меньше времени на эту глубоко укоренившуюся ошибку. - person ZF007; 30.12.2019
comment
Возможным триггером может быть то, что некоторый код использует наследование классов Python в старом стиле внутри некоторых файлов pyd (версия dll для Python) или сочетание использования более старого wxpython (например, v3). Поскольку поддержка wxpython v3 прекращена в 2017 году... это предположение. Если вы не привязаны к wxpython, я бы предложил PyQt5 или PySide. Он производит ваш код gui для вас. - person ZF007; 30.12.2019
comment
Да, это одна из страниц, которые я прочитал, прежде чем опубликовать это. Ваша цитата со страницы неполная. Полная цитата: Причина в том, что некоторые сторонние инструменты, такие как PyInstaller, могут потребовать установки CPython с --enable-framework. Что вам нужно сделать, это запустить $ env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.x.x в вашем терминале. ... что я и сделал. - person mpounsett; 30.12.2019
comment
Спасибо за предложения других фреймворков. Частично смысл использования переносимой среды заключается в том, чтобы сделать ее переносимой... и, учитывая сложные проблемы установки, кажется, что wxPython на самом деле не соответствует этому дескриптору. - person mpounsett; 30.12.2019
comment
Конечно. Я не зашел так далеко, как вы, с src/_app.i из-за ограниченного времени на поиск ошибок, и я уже работал кросс-платформенно с anaconda. Так что проще всего было поприветствовать его на Mac. Скорее всего, во втором квартале 2020 года появится новый Mac, и тогда я дам wxPython еще один шанс. Я опубликую тогда свои выводы. - person ZF007; 30.12.2019
comment
@ ZF007 ваша ссылка на вики-запись VirtualenvOnMac имеет ошибочный символ] в конце. Рабочая ссылка: https://wiki.wxpython.org/wxPythonVirtualenvOnMac. - person abulka; 27.03.2020

Вы упоминаете «virtualenv». Это настоящий пакет virtualenv или просто то, что вы называете экземпляром pyenv? Если первое, попробуйте вместо этого python -m venv. Пакет virtualenv по-прежнему скрывает фреймворк родительского Python, даже спустя столько лет. Пакет venv входит в состав Python3 и является гораздо лучшей/более простой реализацией концепции.

person RobinDunn    schedule 07.01.2020
comment
Как объясняется в вопросе, это плагины virtualenv и virtualenv-wrapper для pyenv. Я не могу с уверенностью сказать, как это реализовано в бэкенде pyenv. - person mpounsett; 21.01.2020