为什么使用sys.path.append(path)代替sys.path.insert(1,path)?


88

编辑:根据Ulf Rompe的评论,重要的是使用“ 1”而不是“ 0”,否则将破坏sys.path

我已经使用Python已有一段时间了(一年多了),而对于人们为什么建议您使用sys.path.append()而不是python,我一直感到困惑sys.path.insert()。让我示范一下。

假设我正在开发一个名为PyWorkbooks的模块(该模块已安装在我的计算机上),但同时我正在开发另一个包含PyWorkbooks的模块(例如PyJob)。当我在PyJob上工作时,我在PyWorkbooks中发现了我要纠正的错误,因此我想导入一个开发版本。

有两种方法可以同时使用这两种方法(例如,我可以将PyWorkbooks项目放置在PyJob内),但是有时我仍然需要遵循这条路。但是,我不能简单地对sys.path.append()PyWorkbooks所在的文件夹执行a。为什么?因为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
我已经完成了,sys.path.insert(1, dev_folder)但仍然找不到开发模块,仅使用已安装的模块。我该如何解决?
endlith 2014年

Answers:


47

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

virtualenv 是创建隔离的Python环境的工具。

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

或更笼统地说,如果您要安装应用程序并保留原样该怎么办?如果某个应用程序可以运行,则其库或这些库的版本中的任何更改都可能破坏该应用程序。

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

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

这就是人们认为insert(0, 错了的原因-这是管理多个环境问题的不完整的权宜之计。


谢谢,我隐约知道类似的东西存在,但到目前为止我还没有实际检查过。因此,我要做的就是在虚拟环境中运行解释器中的所有内容……也可以正常工作。谢谢!
加勒特·伯格

1
这是一个建议,但不能直接回答问题(例如,我有很强的理由不使用virtualenv并且实际上正在寻找与OP相关的答案)
javadba

@javadba对于您的情况可能是正确的,但大多数提出此问题的人都应使用venv
agf

46

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

sys.path.insert(1, path_to_dev_pyworkbooks)

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

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


13

您会混淆附加和前置的概念。以下代码是前置的:

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

它将新信息放置在解释器将通过的搜索序列的开头(准确地说是第二个)。sys.path.append()将事物放在搜索序列的最后。

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

  1. python生态系统介绍

  2. 引导python虚拟环境

如果您确实决定采用隔离环境的方法,那么通过查看virtualenvwrapper肯定会从中受益:http : //www.doughellmann.com/docs/virtualenvwrapper/


1
链接“ python生态系统介绍”,“引导python虚拟环境”已停用,请考虑使它们恢复活力。
Pradeep Singh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.