【问题标题】:Python package installed globally, but not in a virtualenv (PyGTK)全局安装的 Python 包,但不在 virtualenv (PyGTK) 中
【发布时间】:2017-07-03 16:39:27
【问题描述】:

我在“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 / 此线程建议的符号链接来解决此问题: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

(我怀疑其中的一个或多个是不必要的,但我已经摆弄这个问题太久了,并决定停止调查 - 我的设置现在有效,所以我很满意。)

问题解决了!谢谢大家。

【问题讨论】:

  • sys.path 在 global 和 venv 中的输出是什么?
  • pastebin.com/eWiVmUXf 看来 GTK 不在 venv 路径中,这可能是问题所在。

标签: python pygtk virtualenv


【解决方案1】:

尝试使用 --system-site-packages 标志创建您的虚拟环境。

【讨论】:

  • 下次我会考虑试试这个,谢谢你的提示。事实上,这个特殊的 virtualenv 已经用大量额外的包进行了大量定制,我不想从头开始。
  • 我遇到了同样的问题,这个解决方案奏效了。我用那个标志重新创建了 virtualenv。
【解决方案2】:

所以 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 可能会给你带来一些运气

【讨论】:

  • 好的,这似乎是正确的方向。如果我可能会问一个愚蠢的问题,我如何确保这些新的符号链接在启动时位于我的 venv-python 路径中?
  • 好的,这一切都非常有帮助!我发现,在 python 中,为了让 GTK 正常工作,我所要做的就是以下几行:import syssys.path.append('/usr/lib/pymodules/python2.7/gtk-2.0/')sys.path.append('/usr/lib/pymodules/python2.7/')import gtk &gt;&gt;&gt; gtk &lt;module 'gtk' from '/usr/lib/pymodules/python2.7/gtk-2.0/gtk/__init__.pyc'&gt; 但是当我将这两条路径插入到venv/bin/activate如上所述的 shell 文件,“echo $PATH”给了我预期的结果,但在 python 中,sys.path 不包含新位置。
【解决方案3】:

另一种方法是在你的 virtualenv 的 site-packages 目录中创建一个 .pth 文件

例如

(在&lt;virtualenv&gt;/lib/python2.7/site-packages/dist-packages.pth

/usr/lib/python2.7/dist-packages/

这解决了我在安装 apt-get 的 pycairo 版本时遇到的问题

【讨论】:

  • 好的 - 如果我再次遇到这个问题,我一定会试试这个(:
【解决方案4】:

如果你想在virtualenv中包含相关系统的python gtk-2.0的链接,你可以使用pip安装ruamel.venvgtk

pip install ruamel.venvgtk

你没有导入任何东西,链接是在安装过程中设置的。

如果您使用tox,这特别方便,在这种情况下您只需要包含依赖项(用于tox):

deps:
    pytest
    ruamel.venvgtk

并且新设置的python2.7环境将在运行测试之前包含相关链接。

【讨论】:

    【解决方案5】:

    现在可以使用vext 解决此问题。 Vext 允许您在单独访问您的系统包的 virtualenv 中安装包。要访问 PyGTK,请执行以下操作:

    pip install vext
    pip install vext.pygtk
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-25
      • 2019-10-26
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 2014-01-24
      • 2014-01-23
      • 1970-01-01
      相关资源
      最近更新 更多