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

时间:2012-04-10 19:19:13

标签: python path python-import pythonpath

编辑根据Ulf Rompe的评论,使用“1”代替“0”非常重要,否则您将会中断sys.path

我一直在做python已经有一段时间了(一年多了),我总是很困惑为什么人们建议你使用sys.path.append()而不是sys.path.insert()。让我演示一下。

假设我正在开发一个名为PyWorkbooks的模块(安装在我的计算机上),但我同时正在开发一个包含PyWorkbooks的不同模块(比方说PyJob)。当我正在使用PyJob时,我发现PyWorkbooks中的错误正在纠正,所以我想导入一个开发版本。

有两种方法可以同时工作(例如,我可以将PyWorkbooks项目放在PyJob中),但有时我仍然需要使用路径。但是,我不能简单地对PyWorkbooks所在的文件夹sys.path.append()执行。为什么?因为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),我真的很喜欢它,好像你是手动插入路径一样我觉得它是安全的说这是你想要使用的路径!

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

3 个答案:

答案 0 :(得分:44)

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

  

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

     

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

     

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

     

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

     

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

这就是人们认为insert(0,出错的原因 - 对于管理多种环境的问题,这是一个不完整的,权宜之计的解决方案。

答案 1 :(得分:41)

如果你真的需要使用sys.path.insert,请考虑保留sys.path [0]原样:

sys.path.insert(1, path_to_dev_pyworkbooks)

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

  

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

答案 2 :(得分:12)

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

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

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

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

  1. python ecosystems introduction

  2. bootstrapping python virtual environments

  3. 如果你决定走向环境隔离的道路,你肯定会受益于virtualenvwrapper:http://www.doughellmann.com/docs/virtualenvwrapper/