自定义代码在virtualenv中的位置如何?

Phi*_*ham 103 python project virtualenv

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

/foobar
  /bin
    {activate, activate.py, easy_install, python}
  /include
    {python2.6/...}
  /lib
    {python2.6/...}
Run Code Online (Sandbox Code Playgroud)

创建此环境后,将自己放置在何处:

  • python文件?
  • 静态文件(图像/等)?
  • "定制"套餐,例如在网上提供但在奶酪店中找不到的套餐?

virtualenv目录有关?

(假设我已经知道virtualenv目录应该去哪里了.)

Ned*_*ily 87

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

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

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

  • 同意.我将virtualenv用于我所做的一切,而且我从不将文件放在virtualenv目录中.Virtualenv需要对您的项目结构没有影响; 只需激活virtualenv(或使用它的bin/python),无论如何都可以处理你的文件. (7认同)
  • 使用不同选项的具体、实际示例可以更好地解决问题,包括在此问题的其他答案中所见的权衡。 (2认同)
  • 将你的项目与 `virtualenv` 目录分开会更干净,但是将 `virtualenv` 与系统 python 进行比较是没有帮助的,因为 `virtualenv` 的目的是修复损坏的依赖项并隔离项目,以便它们可以使用不同的包版本,甚至python 版本(我意识到这是在 python3 之前编写的)。允许应用程序共享`virtualenv` 使用`virtualenv` 就好像它是系统python 一样,使应用程序容易受到virtualenv 旨在解决的相同问题的影响。`应该有一种明显的方法来做到这一点`; 逻辑上应该是 1:1 (2认同)

Mai*_*der 55

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

/foobar
  /bin
    {activate, activate.py, easy_install, python}
  /include
    {python2.6/...}
  /lib
    {python2.6/...}
  /mypackage1
    __init__.py
  /mypackage2
    __init__.py
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是您始终可以确保找到属于项目内部的激活脚本.

$ cd /foobar
$ source bin/activate
$ python 
>>> import mypackage1
>>>
Run Code Online (Sandbox Code Playgroud)

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

  /virtualenvs
    /foobar
      /bin
        {activate, activate.py, easy_install, python}
      /include
        {python2.6/...}
      /lib
        {python2.6/...}
  /foobar
    /mypackage1
      __init__.py
    /mypackage2
      __init__.py
Run Code Online (Sandbox Code Playgroud)

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

另一个优点是您的一些项目可以使用相同的virtualenv,因此如果您有很多依赖项,则不必反复进行相同的安装.

$ cd /foobar
$ source ../virtualenvs/foobar/bin/activate
$ python 
>>> import mypackage2
>>>
Run Code Online (Sandbox Code Playgroud)

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

http://pypi.python.org/pypi/virtualenvwrapper
Run Code Online (Sandbox Code Playgroud)

有了virtualenvwrapper你就可以

* create and delete virtual environments

* organize virtual environments in a central place

* easily switch between environments
Run Code Online (Sandbox Code Playgroud)

在处理项目"foo"和"bar"时,你不必再担心你的虚拟世界在哪里了:

  /foo
    /mypackage1
      __init__.py
  /bar
    /mypackage2
      __init__.py
Run Code Online (Sandbox Code Playgroud)

这就是你开始研究项目"foo"的方法:

$ cd foo
$ workon
bar
foo
$ workon foo
(foo)$ python
>>> import mypackage1
>>>
Run Code Online (Sandbox Code Playgroud)

然后切换到项目"bar"就像这样简单:

$ cd ../bar
$ workon bar
(bar)$ python
>>> import mypackage2
>>>
Run Code Online (Sandbox Code Playgroud)

很整洁,不是吗?

  • 但强烈*不同意*关于将您的代码放入虚拟环境中.如果你希望它"接近"文件系统上的项目,那么将一个`venv /`目录放在与项目的`BASE_DIR`相同的级别上. (4认同)

Car*_*yer 28

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

事实上,许多人使用virtualenvwrapper,它几乎完全消除了你的意识中的实际虚拟现象,默认情况下将它们并排放在$ HOME/.virtualenvs中.