大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述为什么使用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版本,请阅读以下两个博客:- python ecosystems introduction
- bootstrapping python virtual environments
推荐阅读
- MVC中的“/.well-known/apple-app-site-association”错误
- Android Studio不兼容的类型
- 在Android上的蓝牙中从InputStream读取数据时出错
- ScanCall回来没有进入Android Oreo
- 如何使用WinForms上的C#识别(检测和命名)安装在PC上的防病毒软件
- 如何在PHP中创建数字的缩写
- 如何在Symfony 4中安装KnpPaginatorBundle来对学说进行分页
- 如何解决PHPExcel致命错误(带有消息”无法关闭zip”的未捕获异常” PHPExcel_Writer_Exception”)
- 如何在XAMPP 3.3.2中为Symfony 4项目配置虚拟主机