编辑: 根据Ulf Rompe的评论, 重要的是使用“ 1”而不是“ 0” ,否则将破坏sys.path。
我已经使用Python已有一段时间了(一年多),对于为什么人们建议您使用sys.path.append()而不是,我一直感到困惑sys.path.insert()。让我示范一下。
sys.path.append()
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),我真的很喜欢,就像您手动插入路径一样,我认为可以肯定地说这就是您想要的路径使用!
sys.path.insert(1, path)
还是我有什么问题?这个问题有时会困扰我,我想在户外公开询问!
如果包/模块具有多个版本,则需要使用virtualenv(强调我的):
virtualenv 是创建隔离的Python环境的工具。 解决的基本问题是依赖项和版本之一,以及间接权限。 假设您有一个需要使用LibFoo的版本1的应用程序,但是另一个应用程序需要的版本2。您如何同时使用这两个应用程序? 如果将所有内容都安装到/usr/lib/python2.7/site- packages(或平台的标准位置是什么),则很容易在无意中升级不应升级的应用程序的情况下结束。 或更笼统地说,如果您要安装应用程序并 保留原样该 怎么办?如果应用程序正常运行,则其库或这些库的版本中的任何更改都可能破坏该应用程序。 另外,如果无法将软件包安装到全局site-packages目录中怎么办?例如,在共享主机上。 在所有这些情况下,virtualenv都可以为您提供帮助。它创建一个具有自己的安装目录的环境,该环境不与其他virtualenv环境共享库(也可以选择不访问全局安装的库)。
virtualenv 是创建隔离的Python环境的工具。
virtualenv
解决的基本问题是依赖项和版本之一,以及间接权限。 假设您有一个需要使用LibFoo的版本1的应用程序,但是另一个应用程序需要的版本2。您如何同时使用这两个应用程序? 如果将所有内容都安装到/usr/lib/python2.7/site- packages(或平台的标准位置是什么),则很容易在无意中升级不应升级的应用程序的情况下结束。
/usr/lib/python2.7/site- packages
或更笼统地说,如果您要安装应用程序并 保留原样该 怎么办?如果应用程序正常运行,则其库或这些库的版本中的任何更改都可能破坏该应用程序。
另外,如果无法将软件包安装到全局site-packages目录中怎么办?例如,在共享主机上。
site-packages
在所有这些情况下,virtualenv都可以为您提供帮助。它创建一个具有自己的安装目录的环境,该环境不与其他virtualenv环境共享库(也可以选择不访问全局安装的库)。
这就是人们认为insert(0,错了的原因-这是管理多个环境问题的不完整的权宜之计。
insert(0,