Python 在virtualenv中,自定义代码放在哪里?

Python 在virtualenv中,自定义代码放在哪里?,python,project,virtualenv,Python,Project,Virtualenv,使用virtualenv时应该遵循哪种目录结构?例如,如果我正在构建一个WSGI应用程序,并创建了一个名为foobar的virtualenv,我会从如下目录结构开始: /foobar /bin {activate, activate.py, easy_install, python} /include {python2.6/...} /lib {python2.6/...} 一旦创建了此环境,将在何处放置自己的: python文件 静态文件(图像/等) “

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

/foobar
  /bin
    {activate, activate.py, easy_install, python}
  /include
    {python2.6/...}
  /lib
    {python2.6/...}
一旦创建了此环境,将在何处放置自己的:

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


(假设我已经知道。)

如果您每隔一段时间只有几个项目,没有什么能阻止您为每个项目创建一个新的virtualenv,并将您的软件包放在其中:

/foobar
  /bin
    {activate, activate.py, easy_install, python}
  /include
    {python2.6/...}
  /lib
    {python2.6/...}
  /mypackage1
    __init__.py
  /mypackage2
    __init__.py
这种方法的优点是,您可以始终确保在其中找到属于项目的激活脚本

$ cd /foobar
$ source bin/activate
$ python 
>>> import mypackage1
>>>
<> P>如果你决定要更有组织性,你应该考虑把所有的ValualEnVS放到一个文件夹中,并在你正在进行的项目之后对它们进行命名。
  /virtualenvs
    /foobar
      /bin
        {activate, activate.py, easy_install, python}
      /include
        {python2.6/...}
      /lib
        {python2.6/...}
  /foobar
    /mypackage1
      __init__.py
    /mypackage2
      __init__.py
这样,当出现问题时,您总是可以使用新的VirtualNV重新开始,并且项目文件保持安全

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

$ cd /foobar
$ source ../virtualenvs/foobar/bin/activate
$ python 
>>> import mypackage2
>>>
对于经常需要安装和拆卸virtualenvs的用户来说,查看VirtualEnvRapper是有意义的

http://pypi.python.org/pypi/virtualenvwrapper
有了VirtualVWrapper,你可以

* create and delete virtual environments

* organize virtual environments in a central place

* easily switch between environments
在“foo”和“bar”项目中工作时,您不必再担心您的虚拟人在哪里:

以下是您如何开始“foo”项目的工作:

然后切换到项目“bar”如下所示:

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

很整洁,不是吗

如果给项目一个
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/
,因此您所做的任何更改都会立即在从本地
站点包导入的模块中获取。
#egg
位告诉pip您想给它为您创建的egg包起什么名字


如果不使用
--无站点包
,请小心指定希望pip使用
-E
选项安装到virtualenv中

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

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


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

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


事实上,很多人都使用,这几乎完全消除了你对虚拟现实的认识,默认情况下,它们都并排放在$HOME/.virtualenv中。

@jkp:我不同意。如何布局python应用程序与如何在virtualenv中定位该应用程序以进行开发是不同的。这是相关的,但不一样。请不要重复关闭。同意。我所做的一切都使用virtualenv,而且我从不将文件放在virtualenv目录中。Virtualenv不需要对您的项目结构产生影响;只要激活virtualenv(或者使用它的bin/python),不管你在哪里都可以处理你的文件,我也完全同意。我唯一一次接触我的virtualenv中的任何文件(我使用的是
VirtualEnvrapper
)是当我想编辑
postactivate
postdeactivate
挂钩时。这个问题最好用具体的,不同选项的实际示例,包括在这个问题的其他答案中看到的折衷。将项目与
virtualenv
目录分开比较干净,但是将
virtualenv
与系统python进行比较是没有帮助的,因为
virtualenv
的目的是修复损坏的依赖项并隔离项目,以便它们可以使用不同的包版本,甚至是python版本(我意识到这是在python3之前编写的)。允许应用程序共享一个
virtualenv
使用的是
virtualenv
,就好像它是系统python一样,使应用程序容易受到virtualenv设计要解决的问题的影响
应该有一个明显的方法来实现这一点
;逻辑上应该是1:1@Ned:试图获得一些最佳实践,但仍不清楚:如果您有几十个项目,每个项目都有自己的virtualenv,那么您如何跟踪哪个项目与哪个virtualenv一起使用?在每个文件夹的根目录中添加带有您使用的virtualenv名称的小shell脚本?我非常同意关于使用
VirtualEnvrapper
的回答。它巧妙地抽象了virtualenv,同时还为您提供了所有的好处。但对于是否将代码放入虚拟环境,我们有强烈的异议。如果你想让它靠近公共关系
$ cd ../bar
$ workon bar
(bar)$ python
>>> import mypackage2
>>>
$ virtualenv --no-site-packages myproject
$ . myproject/bin/activate
$ easy_install pip
$ pip install -e hg+http://bitbucket.org/owner/myproject#egg=proj