【问题标题】:What does wxPython need to run successfully?wxPython 需要什么才能成功运行?
【发布时间】:2019-12-22 20:48:24
【问题描述】:

我正在尝试让 wxPython 在 MacOS 上使用 virtualenvvirtualenvwrapper 插件在基于 pyenv 的虚拟环境中工作。我已经阅读了有关使这项工作的几个问题,但大多数答案似乎都假设我正在使用系统 python 版本,和/或仅解决损坏设置的一个方面。我还没有看到任何解释 wxPython 在启动时检查的内容。

我有由 pyenv 用--enable-framework 编译的 python 3.7。

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

需要明确的是,我的 Python 工具链中的任何工具或库都不是由 Homebrew 安装的。

我的 virtualenv 可以通过 --system-site-packages 访问框架。可以访问框架和显示应该是 wxPython 工作所需的全部,但在启动任何测试应用程序时我仍然遇到相同的错误:

此程序需要访问屏幕。请运行 python的框架构建,仅当您登录时 在 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也允许GUI访问,所以 python 和 pythonw 现在可以互换了。

有没有人详尽列出 wxPython 在运行之前实际期望找到的内容?

【问题讨论】:

    标签: python-3.x macos wxpython pyenv


    【解决方案1】:

    您遇到的错误很可能是“brew-hole”(又名 wxpython v3 和 v4 的自制安装/兼容性问题)。

    要测试可能出现的一些问题,请在您的 pyenv 中执行以下操作:

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

    它们是如何安装的?你用过brew吗?

    1. 如果是 brew 或任何非 anaconda:全部卸载。

    2. 然后:通过 anaconda 2019. (xx >04) 打包版本重新安装 python,它会根据您的选择为您提供 3.7.4 或 3.7.5。

    3. 通过 conda/pip cmd-line 重新安装默认安装未安装的所需软件包。

    Anaconda "base" 是您的默认环境。

    1. 然后是conda create --name myenv,其中 myenv 是您为环境指定的任何名称。例如“myPythonwx408”环境。
    2. 命令行:conda activate myenv

    ...和tada..你去...

    如果错误在 anaconda env 中仍然存在,您可以发布 environment.yml 文件,以便我可以重新创建您的环境进行测试。

    【讨论】:

    • 我所有的 python 版本都是由 penv 安装的(即env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.7.4。我正在更新问题以解决这种歧义。所涉及的工具都不是由 brew 安装的。anaconda 会为我提供什么用--enable-framework自己编译python(通过pyenv)不会?
    • 我还应该注意,这并没有回答核心问题,即 wxPython 成功运行实际需要什么。
    • wxpython [wiki.wxpython.org/wxPythonVirtualenvOnMac] 描述了根本问题,甚至他们也不知道确切的问题是什么。他们的回答是:原因是因为像 PyInstaller 这样的一些 3rd 方工具可能需要使用 --enable-framework 构建 CPython 安装。您已经尝试过他们的解决方法,但仍然无法正常工作。发布的解决方案是我如何在这个根深蒂固的错误上花费更少的时间。
    • 一个可能的触发因素可能是某些代码在某些pyd(dll 的python 版本)文件中使用了旧式python 类继承,或者混合使用了旧的wxpython(例如v3)。由于 wxpython v3 支持在 2017 年被放弃......它的猜测。如果您不受 wxpython 约束,我的建议是 PyQt5 或 PySide。它会为你生成你的 gui 代码。
    • 是的,这是我在发布之前阅读的页面之一。您在页面上的报价不完整。完整的引用是:“原因是因为像 PyInstaller 这样的一些 3rd 方工具可能需要使用 --enable-framework 构建 CPython 安装。你需要做的是在你的终端中运行 $ env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.x.x。” ...这就是我所做的。
    【解决方案2】:

    您提到“virtualenv”。那是实际的 virtualenv 包还是您所称的 pyenv 实例?如果是前者,请改用python -m venv。即使经过这么多年,virtualenv 包仍然隐藏了父 Python 的框架特性。 venv 包包含在 Python3 中,是该概念的更好/更简单的实现。

    【讨论】:

    • 正如问题中所解释的,它是pyenvvirtualenvvirtualenv-wrapper 插件。我不能肯定地说pyenv在后端是如何实现的。
    猜你喜欢
    • 2013-04-10
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2020-05-12
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多