在Ubuntu上使用Virtualenv且不包含site-packages

25

最近在使用Python进行开发时,我开始使用virtualenv。我喜欢使用--no-site-packages选项创建隔离的开发环境,但是在开发PyGTK应用程序时这样做可能有点棘手。

Ubuntu默认安装了PyGTK模块,我想让一个已经使用了--no-site-packages的virtualenv知道其他位置的特定模块。

这该如何解决呢?或者我应该放弃--no-site-packages选项吗?

5个回答

34
$ virtualenv --no-site-packages --python=/usr/bin/python2.6 myvirtualenv
$ cd myvirtualenv
$ source bin/activate
$ cd lib/python2.6/
$ ln -s /usr/lib/pymodules/python2.6/gtk-2.0/ 
$ ln -s /usr/lib/pymodules/python2.6/pygtk.pth 
$ ln -s /usr/lib/pymodules/python2.6/pygtk.py 
$ ln -s /usr/lib/pymodules/python2.6/cairo/
$ python
>>> import pygtk
>>> import gtk

8
这让我找到了正确的方向,但是随着Ubuntu 11.10的推出,情况有些变化。在Ubuntu 11.10中针对Python 2.7,需要使用类似这样的指令:ln -sf /usr/lib/python2.7/dist-packages/{glib,gobject,cairo,gtk-2.0,pygtk.py,pygtk.pth} lib/python2.7/site-packages - keturn
2
注意:gtk文件夹和pth文件需要放在lib/python2.6/site-packages中,而不是lib/python2.6。参见:https://dev59.com/C1DTa4cB1Zd3GeqPGBJW - jmanning2k
2
这是对keturns版本的小修改,以使用环境变量:$ ln -sf /usr/lib/python2.7/dist-packages/{glib,gobject,cairo,gtk-2.0,pygtk.py,pygtk.pth} $VIRTUAL_ENV/lib/python2.7/site-packages - Stuart Axon

5

一种方法是使用sys.path将路径添加到您的代码中。

import sys

sys.path.append(somepath)

另一种方法是使用site,它可以处理.pth文件并将其添加到sys.path中。
import site

site.addsitedir(sitedir, known_paths=None)

https://docs.python.org/library/site.html

但你可能不想将此添加到所有相关代码中。

我见过有人提到使用sitecustomize.py来执行类似的操作,但经过一些测试后,我发现它不能按照预期工作。

在这里提到自动导入sitecustomize.py在2.5中结束,如果您不是在2.5上,请尝试一下(只需将上述路径添加方法之一添加到文件中并将其放置在程序运行的目录中)。

对于2.5及以上版本的用户,在帖子中提到了一个解决方法。

http://code.activestate.com/recipes/552729/


1

在这种情况下,我发现符号链接,甚至复制特定文件(包、模块、扩展)非常有效。

它允许程序模拟在目标环境中运行,而不是改变应用程序以适应开发环境。

对于类似AppEngine的东西也是一样的。


是的,但符号链接在哪里?如果我想要为PyGTK创建符号链接,我需要链接什么? - Jeremy Cantrell
链接到您的站点包。在我的Ubuntu上,我有/usr/lib/python-support/python-gtk2/python2.5/gtk-2.0/gtk。已经/var/lib/python-support/python2.5/gtk-2.0/gtk链接到那里。看起来是个不错的开始,您可能需要尝试和错误。但下次您将能够轻松地编写脚本。 - Ali Afshar

1
请查看此处的postmkvirtualenv钩子脚本:

https://dev59.com/l3I-5IYBdhLWcg3wN1lD#9716100

在这种情况下,他正在使用它来在创建新的Virtualenv之后导入PyQt和SIP,但您可以将所需的软件包添加到LIBS中。
并且投票支持该脚本,因为它非常棒 :)

0

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

pip install ruamel.venvgtk 您不需要导入任何内容,链接会在安装过程中设置。

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

deps:
    pytest
    ruamel.venvgtk

在运行测试之前,新设置的Python 2.7环境将包含相关链接。

有关链接设置的更详细信息,请参见此答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接