我在“virtualenv”中遇到了PyGTK的一些奇怪问题。 gtk不会导入我的virtualenv,而它在我的全局python安装中导入。 (上周我没有遇到这个问题,猜测某些软件更新会让人感到不安。)
有解决此问题的好方法吗?
此处显示:全局导入gtk,
tom@zeppelin:~$ python
Python 2.7.1+ (r271:86832, Sep 27 2012, 21:12:17)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import gtk
>>> gtk
<module 'gtk' from '/usr/lib/pymodules/python2.7/gtk-2.0/gtk/__init__.pyc'>
然后无法导入gtk,
tom@zeppelin:~$ workon py27
(py27)tom@zeppelin:~$ python
Python 2.7.1+ (r271:86832, Sep 27 2012, 21:12:17)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import gtk
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named gtk
不幸的是,这破坏了我的ipython --pylab环境:http://pastebin.com/mM0ur7Hc
更新: 我能够通过添加grepic / this thread建议的符号链接来解决这个问题:Python: virtualenv - gtk-2.0
略有不同,即我的“cairo”套餐位于/usr/lib/pymodules/python2.7/cairo/
而不是/usr/lib/python2.7/dist-packages/cairo
。
第二次更新:
我还发现将以下行添加到venv/bin/activate
:
export PYTHONPATH=$PYTHONPATH:/home/tom/.virtualenvs/py27/lib/python2.7/dist-packages
export PYTHONPATH=$PYTHONPATH:/home/tom/.virtualenvs/py27/lib/python2.7/dist-packages/gtk-2.0
export PYTHONPATH=$PYTHONPATH:/usr/lib/pymodules/python2.7/gtk-2.0
(我怀疑其中一个或多个是不必要的,但我已经花了很长时间来解决这个问题并决定停止调查 - 我的设置现在有效,所以我很满意。)
问题解决了!谢谢大家。
答案 0 :(得分:12)
尝试使用--system-site-packages标志创建虚拟环境。
答案 1 :(得分:4)
因此,gtk通常位于/usr/lib/python2.7/dist-packages这样的地方,这个地方位于您的全局环境中的Python路径中,但不在您的虚拟环境中。
您可能希望手动添加gtk的路径,例如
import sys
sys.path.append("/usr/lib/python2.7/dist-packages/gtk")
您还可以在激活虚拟环境时更改路径。打开venv / bin / activate。这是一个可怕的文件,但最后你可以把:
export PATH=$PATH:/my/custom/path
保存并在下次激活虚拟环境时使用:
source venv/bin/activate
您的自定义路径将位于路径中。您可以使用
进行验证echo $PATH
另一种建议Python: virtualenv - gtk-2.0的方法是进入你的virtualenv目录并添加一个'dist-packages'目录并创建你之前使用的gtk包的符号链接:
mkdir -p venv/lib/python2.7/dist-packages/
cd venv/lib/python2.7/dist-packages/
对于GTK2:
ln -s /usr/lib/python2.7/dist-packages/glib/ glib
ln -s /usr/lib/python2.7/dist-packages/gobject/ gobject
ln -s /usr/lib/python2.7/dist-packages/gtk-2.0* gtk-2.0
ln -s /usr/lib/python2.7/dist-packages/pygtk.pth pygtk.pth
ln -s /usr/lib/python2.7/dist-packages/cairo cairo
对于GTK3:
ln -s /usr/lib/python2.7/dist-packages/gi gi
完全披露:我觉得这两种解决方案都有点苛刻,如果你说这个问题很紧急就可以了。可能有一种“适当”的方式来扩展虚拟环境,所以如果您最终发现更好的解决方案,请告诉我们。你可能会对http://www.virtualenv.org/en/latest/index.html#creating-your-own-bootstrap-scripts
感到幸运答案 2 :(得分:2)
另一种方法是在virtualenv的site-packages目录中创建一个.pth文件
例如
(在<virtualenv>/lib/python2.7/site-packages/dist-packages.pth
)
/usr/lib/python2.7/dist-packages/
这解决了我在apt-get安装的pycairo版本中遇到的问题
答案 3 :(得分:2)
如果你想在virtualenv中包含指向相关系统的python gtk-2.0的链接,你可以使用pip来安装ruamel.venvgtk:
pip install ruamel.venvgtk
您没有导入任何内容,安装过程中会设置链接。
如果您使用tox
,这尤其方便,在这种情况下,您只需要包含依赖项(对于tox):
deps:
pytest
ruamel.venvgtk
并且新设置的python2.7环境将在运行测试之前包含相关链接。
答案 4 :(得分:2)
现在可以使用vext解决此问题。 Vext允许您在virtualenv中安装软件包,以便单独访问您的系统软件包。要访问PyGTK,请执行以下操作:
'\e808'