为什么要使用sys.path.append(路径),而不是sys.path.insert(1路)?为

2019-05-13 11:58发布

编辑:根据乌尔夫Rompe的评论, 你用“1”而不是“0”,否则你会打破它是非常重要的 sys.path中 。

我一直在做蟒蛇相当长的一段时间了(超过一年),而我总是困惑,为什么人们建议您使用sys.path.append()代替sys.path.insert() 让我来证明。

比方说,我在一个模块名为PyWorkbooks工作(即安装在我的计算机上),但我在不同的模块同时工作(比方说PyJob)并入PyWorkbooks。 由于我的工作PyJob我发现,我纠正错误PyWorkbooks,所以我想导入一个开发版本。

有多种方法可以在两个工作(我可以把我的PyWorkbooks项目PyJob内,例如),但有时我仍然需要与路径玩。 但是, 我不能简单地做一个sys.path.append()到PyWorkbooks是在文件夹中 。 为什么? 因为Python会先找到我安装PyWorkbooks!

这就是为什么你必须做一个sys.path.insert(1,path_to_dev_pyworkbooks)

综上所述:

sys.path.append(path_to_dev_pyworkbooks)
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one

要么:

sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0**
import PyWorkbooks # imports correct file

这在过去造成了一些挂断了我,我真的很喜欢它,如果我们(作为一个团体)开始推荐sys.path.insert(1, path) ,因为如果你手工将一个路径,我认为它是肯定地说,这是您要使用的路径!

还是我什么了吗? 这是一个问题,有时令我烦恼,我想它的开放!

Answer 1:

如果你有一个包/模块的多个版本,你需要使用的virtualenv (重点煤矿):

virtualenv是创建孤立的Python环境的工具。

正在解决的基本问题是依赖关系和版本,间接的权限之一。 想象一下,你有一个需要libfoo的版本1的应用程序,但你怎么能同时使用这些应用程序另一个应用程序需要版本2? 如果您安装到一切/usr/lib/python2.7/site-packages (或任何平台的标准位置),很容易在一个情况下,你无意中升级不应该升级的应用程序来结束。

或者更一般地,如果你想要安装的应用程序,并把它 如果一个应用程序的工作,在图书馆或任何改变这些库的版本可以打破该应用程序。

另外,如果您不能安装什么包进入全球site-packages目录? 例如,一个共享的主机上。

在所有这些情况下, virtualenv可以帮助你。 它创建有自己的安装目录的环境中,不与其他的virtualenv环境共享库(并可选地不要么访问全球的装机库)。

这就是为什么人们认为insert(0,是错误的-这是一个不完整的,权宜之计来管理多个环境问题。



Answer 2:

如果你确实需要使用sys.path.insert,考虑离开的sys.path [0],因为它是:

sys.path.insert(1, path_to_dev_pyworkbooks)

这可能是重要的,因为第三方代码可能依赖于sys.path中文档的一致性:

为对程序启动时,该列表的第一项,路径[0]初始化,是含有用于调用Python解释脚本的目录。



Answer 3:

你混淆了追加和预先计算的概念。 下面的代码是预先计算:

sys.path.insert(1,'/thePathToYourFolder/')

它把在开始(当然,第二,要准确),你的解释会通过搜索序列的新信息。 sys.path.append()把东西在搜索顺序的末尾。

这是可取的,你使用类似virtualenv ,而不是手动编码您的软件包目录到PYTHONPATH每次。 设立该单独的站点包和Python的可能版本不同的生态系统,阅读这些两个博客:

  1. 蟒蛇生态系统介绍

  2. 引导蟒蛇虚拟环境

:如果你决定要向下移动的路径,环境隔离,你一定会通过观察virtualenvwrapper受益http://www.doughellmann.com/docs/virtualenvwrapper/



文章来源: Why use sys.path.append(path) instead of sys.path.insert(1, path)?