问题:自定义代码在virtualenv中的什么位置?
使用时应该遵循哪种目录结构virtualenv
?例如,如果我正在构建WSGI应用程序并创建了一个名为virtualenv的虚拟环境,那么foobar
我将从以下目录结构开始:
/foobar
/bin
{activate, activate.py, easy_install, python}
/include
{python2.6/...}
/lib
{python2.6/...}
创建此环境后,将在哪里放置自己的环境:
- python文件?
- 静态文件(图像/等)?
- “自定义”程序包,例如在线提供但在奶酪店中找不到的程序包?
关于virtualenv
目录?
(假设我已经知道virtualenv目录本身应该在哪里。)
回答 0
virtualenv
提供python解释器实例,而不是应用程序实例。通常,您不会在包含系统默认Python的目录中创建应用程序文件,同样,也无需在virtualenv目录中定位应用程序。
例如,您可能有一个项目,其中有多个使用同一virtualenv的应用程序。或者,您可能正在使用virtualenv测试应用程序,该应用程序随后将与系统Python一起部署。或者,您可能正在打包一个独立的应用程序,在该应用程序中,将virtualenv目录放置在应用程序目录本身内的某个位置可能很有意义。
因此,总的来说,我认为这个问题没有一个正确的答案。而且,一件好事virtualenv
是它支持许多不同的用例:不需要有正确的方法。
回答 1
如果您经常只有几个项目,那么没有什么可以阻止您为每个项目创建一个新的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
>>>
如果您决定更加有条理,则应考虑将所有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”上工作时,您无需再担心virtualenvs的位置:
/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
>>>
很整洁,不是吗?
回答 2
因为virtualenvs不可重定位,所以我认为将项目文件放在virtualenv目录中是不明智的做法。virtualenv本身是一个生成的开发/部署工件(有点像.pyc文件),而不是项目的一部分;应该很容易将其吹散并随时重新创建,或者在新的部署主机上创建一个新的,等等。
实际上,许多人都使用virtualenvwrapper,它几乎完全从您的意识中删除了实际的virtualenvs,默认情况下将它们全部并排放置在$ HOME / .virtualenvs中。
回答 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您要给它为您创建的鸡蛋包装取什么名字。
如果您不使用--no-site-packages
,请谨慎指定要使用-E
选项将pip安装到virtualenv中