编辑:基于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版本,请阅读以下两个博客:
如果您决定沿着通往环境隔离的道路前进,那么通过查看virtualenvwrapper肯定会受益:http://www.doughellmann.com/docs/virtualenvwrapper/