Virtualenv ". venv/bin/activate"与"source venv/bin/activate"有什么区别?

19
假设我创建了一个名为“venv”的虚拟环境(virtualenv venv)。
从教程中了解到,有两种方式激活虚拟环境:
1. . venv/bin/activate 2. source venv/bin/activate 我认为它们都能实现同样的效果,但我不理解其运作原理。
另外,对于第一种方法,"." 不是表示当前文件夹吗?但是如果我只输入 "venv/bin/activate" 而没有 "." ,它却无法工作。
希望得到帮助!
2个回答

26
.source的作用完全相同,唯一的区别是source更易读,在所有的shell中可能都不可用。此命令在当前shell中运行脚本内容非常重要,对于activate的情况尤其如此,因为脚本执行的其中一个任务就是导出和修改当前shell中的环境变量。如果你使用./path/to/activate运行它,那么该脚本将在子shell中运行,一旦脚本完成并且子shell终止,所有已设置的环境变量都将丢失。

另外,对于第1点,"."不只是表示当前文件夹吗?

.在不同的上下文中有不同的含义。当用作路径时(或作为路径的一部分时),它才表示“当前文件夹”。
http://en.wikipedia.org/wiki/Dot_%28Unix%29可以得知:

点命令不应与点文件(以点为前缀的隐藏文件或隐藏目录)混淆。


顺便提一下,我建议你看一下virtualenvwrapper,它提供了更多的包装命令,使得virtualenv的使用更加容易。使用virtualenvwrapper,只需调用以下命令即可轻松切换到一个环境:
workon YOUR_ENV

@JohnP 哎呀,我可能不小心把它编辑掉了。让我把它放回去。 - Shawn Chin
如果你使用的是Ubuntu,你必须注意它使用的Dash和在早期版本中/bin/bash指向dash(不确定现在是否仍然如此)。因此,source命令无法正常工作,但"."命令可以正常工作。 - John P
我使用 source venv/bin/activate - AnonymousUser

4
.命令实际上是source的别名。它们都在当前shell中执行给定的脚本,而不创建新的子shell。 这里有一些不错的示例。

2
相反的是:.POSIX指定命令,可以在任何地方使用,而source是别名(只能在一部分shell上使用)。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接