我已经在我的 Mac 上安装了 Python 2.7 作为框架构建。我已经安装并确认 wxPython 可以与这个 Python 版本一起使用。但是当我使用 virtualenv 创建虚拟环境时,生成的 Python 可执行文件不是框架构建,或者至少不是根据 wxPython:
该程序需要访问屏幕。 请使用 python 的框架构建运行,并且仅当您是 在 Mac 的主显示屏上登录。
有任何想法吗?
我已经在我的 Mac 上安装了 Python 2.7 作为框架构建。我已经安装并确认 wxPython 可以与这个 Python 版本一起使用。但是当我使用 virtualenv 创建虚拟环境时,生成的 Python 可执行文件不是框架构建,或者至少不是根据 wxPython:
该程序需要访问屏幕。 请使用 python 的框架构建运行,并且仅当您是 在 Mac 的主显示屏上登录。
有任何想法吗?
另一种解决方案是将以下脚本添加到 /Path/To/VirtualEnv/bin:
ENV=`python -c "import sys; print sys.prefix"`
PYTHON=`python -c "import sys; print sys.real_prefix"`/bin/python
export PYTHONHOME=$ENV
exec $PYTHON "$@"
然后,每当您想运行 GUI(例如 wxPython)时,请使用my_script main.py
(确保 virtualenv处于活动状态)
同样的问题,pythonw
不能作为框架使用。有一个可用的解决方法。我们像这样使用它pythonw
作为框架应用程序包提供:
curl -O https://raw.githubusercontent.com/gldnspud/virtualenv-pythonw-osx/master/install_pythonw.py
curl -O https://raw.githubusercontent.com/gldnspud/virtualenv-pythonw-osx/master/pythonw.c
python install_pythonw.py `which python`/../..
rm install_pythonw.py pythonw.c
在 10.10.3 上,使用 virtualenv(如果重要,通过 pyenv),我做了一个brew install wxmac
.
我的应用程序脚本上有这个
import site
site.addsitedir("/usr/local/lib/python2.7/site-packages")
我使用这个包装器来运行我的脚本,称为“app.py”
#!/bin/bash
# what real Python executable to use
PYVER=2.7
PYTHON=/System/Library/Frameworks/Python.framework/Versions/$PYVER/bin/python$PYVER
# pythonw is key here!
PYTHON="pythonw"
# now run Python with the virtualenv set as Python's HOME
export PYTHONHOME=$VIRTUAL_ENV
exec $PYTHON "$@"
运行它fwpy app.py
要回答所提出的问题:virtualenv 中的 Python 可执行文件是执行主要 Python 可执行文件的存根,并且不存在于可以自动识别包的路径中。这导致Foundation.NSBundle.mainBundle()
返回一个NSBundle
刚刚指向bin/
virtualenv 中的目录,没有关联Info.plist
,因此没有关联bundleIdentifier
;这使得无法使用某些 API(例如,正如您所注意到的,Cocoa GUI API)。
我将这些解决方法打包成一个小工具,您可以pip install
将其放入您的 virtualenv 中,然后运行:
现在很原始。你只需要pip install venvdotapp; venvdotapp
在你的 virtualenv 中做。import venvdotapp; venvdotapp.require_bundle()
如果您正在编写一些需要您的 venv 捆绑的代码,您也可以这样做。
添加
export PYTHONHOME=$VIRTUAL_ENV
alias python=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3 # set path to ur python
在 venv激活脚本的末尾