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

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

一旦创建了这个环境,人们会将自己的环境放置在哪里:

  • python 文件?
  • 静态文件(图像/等)?
  • “定制”套餐,例如那些在网上可以买到但在奶酪店找不到的套餐?

virtualenv 目录?

(假设我已经知道 virtualenv 目录本身应该放在哪里.)

有帮助吗?

解决方案

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

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

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

其他提示

如果你经常只有几个项目,那么没有什么可以阻止你为每个项目创建一个新的 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
>>>

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

  /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
>>>

对于经常需要设置和拆除 virtualenv 的用户来说,查看 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”时,您不再需要担心 virtualenv 的位置:

  /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
>>>

非常整洁,不是吗?

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

其实很多人都用 虚拟环境包装器, ,这几乎完全从您的意识中消除了实际的 virtualenvs,默认情况下将它们全部并排放置在 $HOME/.virtualenvs 中。

如果你给你的项目一个 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 bit 告诉 pip 你想给它为你创建的 Egg 包起什么名字。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top