117

使用时应该遵循什么样的目录结构virtualenv?例如,如果我正在构建一个 WSGI 应用程序并创建了一个名为 virtualenv,foobar我将从如下目录结构开始:

/foobar
  /bin
    {activate, activate.py, easy_install, python}
  /include
    {python2.6/...}
  /lib
    {python2.6/...}

一旦创建了这个环境,他们自己的地方应该放在哪里:

  • 蟒蛇文件?
  • 静态文件(图像/等)?
  • “定制”包,例如那些在线提供但在奶酪店找不到的包?

关于virtualenv目录?

(假设我已经知道virtualenv 目录本身应该去哪里。)

4

4 回答 4

97

virtualenv提供 python 解释器实例,而不是应用程序实例。您通常不会在包含系统默认 Python 的目录中创建应用程序文件,同样也不需要在 virtualenv 目录中找到您的应用程序。

例如,您可能有一个项目,其中有多个应用程序使用相同的 virtualenv。或者,您可能正在使用 virtualenv 测试应用程序,该应用程序稍后将使用系统 Python 进行部署。或者,您可能正在打包一个独立的应用程序,将 virtualenv 目录放在应用程序目录本身的某个位置可能是有意义的。

所以,总的来说,我认为这个问题没有一个正确的答案。而且,它的好处virtualenv是它支持许多不同的用例:不需要一种正确的方法。

于 2009-11-23T18:44:16.873 回答
60

如果你经常只有几个项目,没有什么能阻止你为每个项目创建一个新的 virtualenv,并将你的包放在里面:

/foobar
  /bin
    {activate, activate.py, easy_install, python}
  /include
    {python2.6/...}
  /lib
    {python2.6/...}
  /mypackage1
    __init__.py
  /mypackage2
    __init__.py

这种方式的好处是,你总能确保在里面找到属于项目的activate脚本。

$ cd /foobar
$ source bin/activate
$ python 
>>> import mypackage1
>>>

如果您决定更有条理,您应该考虑将所有 virtualenvs 放在一个文件夹中,并以您正在处理的项目命名它们。

  /virtualenvs
    /foobar
      /bin
        {activate, activate.py, easy_install, python}
      /include
        {python2.6/...}
      /lib
        {python2.6/...}
  /foobar
    /mypackage1
      __init__.py
    /mypackage2
      __init__.py

这样,当出现问题时,您始终可以使用新的 virtualenv 重新开始,并且您的项目文件保持安全。

另一个优点是您的多个项目可以使用相同的 virtualenv,因此如果您有很多依赖项,您不必一遍又一遍地进行相同的安装。

$ cd /foobar
$ source ../virtualenvs/foobar/bin/activate
$ python 
>>> import mypackage2
>>>

对于经常需要设置和拆除 virtualenvs 的用户来说,看看 virtualenvwrapper 是有意义的。

http://pypi.python.org/pypi/virtualenvwrapper

使用 virtualenvwrapper 你可以

* create and delete virtual environments

* organize virtual environments in a central place

* easily switch between environments

在处理项目“foo”和“bar”时,您不必再担心您的虚拟环境在哪里:

  /foo
    /mypackage1
      __init__.py
  /bar
    /mypackage2
      __init__.py

这就是您开始处理项目“foo”的方式:

$ cd foo
$ workon
bar
foo
$ workon foo
(foo)$ python
>>> import mypackage1
>>>

然后切换到项目“bar”就这么简单:

$ cd ../bar
$ workon bar
(bar)$ python
>>> import mypackage2
>>>

很整洁,不是吗?

于 2009-11-23T14:33:35.943 回答
31

因为 virtualenvs 不可重定位,我认为将项目文件放在 virtualenv 目录中是不好的做法。virtualenv 本身是一个生成的开发/部署工件(有点像 .pyc 文件),不是项目的一部分;它应该很容易吹走并随时重新创建,或者在新的部署主机上创建一个新的,等等。

事实上,许多人使用virtualenvwrapper,它几乎完全从您的意识中移除了实际的 virtualenvs,默认情况下将它们全部并排放置在 $HOME/.virtualenvs 中。

于 2009-11-23T20:35:28.133 回答
3

如果你给你的项目一个setup.py, pip 可以直接从版本控制中导入它。

做这样的事情:

$ virtualenv --no-site-packages myproject
$ . myproject/bin/activate
$ easy_install pip
$ pip install -e hg+http://bitbucket.org/owner/myproject#egg=proj

-e会将项目放入,但将其myproject/src链接到myproject/lib/pythonX.X/site-packages/,因此您所做的任何更改都将立即在从本地导入它的模块中获取site-packages。该#egg位告诉 pip 你想给它为你创建的 egg 包起什么名字。

如果您不使用,请注意使用选项--no-site-packages指定您希望 pip 安装到 virtualenv 中-E

于 2009-11-23T16:07:43.993 回答