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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么使用sys.path.append(path)而不是sys.path.insert(1,path)?相关的知识,希望对你有一定的参考价值。

编辑:基于Ulf Rompe的评论,重要的是你使用“1”而不是“0”,否则你将打破sys.path

我一直在做python很长一段时间(超过一年),我总是很困惑,为什么人们建议你使用sys.path.append()而不是sys.path.insert()。让我来证明一下。

假设我正在开发一个名为PyWorkbooks的模块(安装在我的计算机上),但我同时正在开发一个包含PyWorkbooks的不同模块(比方说PyJob)。当我正在使用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),我会非常喜欢它,就像你手动插入路径一样我认为可以安全地说这是你的路径想用!

或者我有什么不对劲?这个问题有时会困扰我,我希望它在公开场合!

答案

如果您有多个版本的软件包/模块,则需要使用virtualenv(强调我的):

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

要解决的基本问题是依赖关系和版本,以及间接权限。想象一下,您有一个需要LibFoo版本1的应用程序,但另一个应用程序需要版本2.您如何使用这两个应用程序?如果您将所有内容安装到/usr/lib/python2.7/site-packages(或任何平台的标准位置),则很容易在无意中升级不应升级的应用程序的情况下结束。

或者更一般地说,如果你想安装一个应用程序并留下它,该怎么办?如果应用程序有效,则其库中的任何更改或这些库的版本都可能会破坏应用程序。

另外,如果您无法将软件包安装到全局site-packages目录中,该怎么办?例如,在共享主机上。

在所有这些情况下,virtualenv可以帮助您。它创建了一个具有自己的安装目录的环境,该环境不与其他virtualenv环境共享库(并且可选地也不访问全局安装的库)。

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

另一答案

如果您确实需要使用sys.path.insert,请考虑保留sys.path [0]:

sys.path.insert(1, path_to_dev_pyworkbooks)

这可能很重要,因为第三方代码可能依赖于sys.path documentation一致性:

在程序启动时初始化时,此列表的第一项path [0]是包含用于调用Python解释器的脚本的目录。

另一答案

你混淆了追加和前置的概念。以下代码是前置代码:

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

它将新信息放在解释器将要经历的搜索序列的开头(嗯,第二,确切地说)。 sys.path.append()把事情放在搜索序列的最后。

建议您使用virtualenv之类的东西,而不是每次都将包目录手动编码到PYTHONPATH中。要设置各种生态系统来分离您的站点包和可能的python版本,请阅读以下两个博客:

  1. python ecosystems introduction
  2. bootstrapping python virtual environments

如果您决定沿着通往环境隔离的道路前进,那么通过查看virtualenvwrapper肯定会受益:http://www.doughellmann.com/docs/virtualenvwrapper/

以上是关于为什么使用sys.path.append(path)而不是sys.path.insert(1,path)?的主要内容,如果未能解决你的问题,请参考以下文章

关于sys.path.append()

Python sys.path.append(xx)

python sys.path.append('..')括号里这两个点是啥意思?

sys.path.insert

Python3基础 sys.path.append 增加模块的搜索路径

sys模块