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