我可以让我的pip用户安装包比系统更受欢迎吗?

时间:2014-12-12 14:54:18

标签: python pip setup.py sys.path

我想找出一个“万无一失”的安装指令,放入Python项目的自述文件中,称之为footools,这样我们组中的其他人就可以安装最新的SVN版本了在他们的笔记本电脑和他们的服务器帐户上。

问题是当Python调用pip安装的脚本时,Python会使用用户安装的lib。例如,我们在/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/中使用的是具有旧版脚版的服务器。

如果我执行python2.7 setup.py install --user并运行主条目脚本,它将使用/Users/unhammer/Library/Python/2.7/lib/python/site-packages/中的文件。这就是我想要的,但仅setup.py不会安装依赖项。

如果我(还原安装)而不是pip-2.7 install --user .并运行主条目脚本,它会使用/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/中的旧文件 - 这不是我想要的。

如果我(还原安装和)而不是pip-2.7 install --user -e .并运行主条目脚本,它会使用.中的文件 - 这不是我想要的,用户应该能够删除source dir(并且能够在不影响安装的情况下进行调整)。


我可以使用(并推荐其他人使用)python2.7 setup.py install --user - 但他们必须先做

pip-2.7 install -U --user -r requirements.txt -e .
pip-2.7 uninstall -y footools

为了安装依赖项(因为pip没有install --only-deps选项)。但这很冗长。

什么是setup.py做那个点不在这里?

(编辑清楚我正在寻找更简单+更安全的安装说明。)

2 个答案:

答案 0 :(得分:3)

安装virtualenvwrapper。我允许设置单独的python环境来缓解您可能遇到的任何冲突。 Here is a tutorial用于安装和使用virtualenv。

相关:

答案 1 :(得分:1)

在安装过程中由pip生成的控制台脚本应使用用户安装的库版本,如PEP 370所示:

  

在系统站点目录之前添加用户站点目录   但是在Python的搜索路径和PYTHONPATH之后。 此设置允许   用户安装与系统不同的软件包版本   管理员但它可以防止用户意外覆盖   stdlib模块。 Stdlib模块仍然可以被覆盖   PYTHONPATH。

Sidenote

Setuptools通过在easy_install.pth目录中的site-packages文件中插入代码来使用hack。此代码使用setuptools安装的软件包位于sys.path中的其他软件包之前,因此它们 shadow 具有相同名称的其他软件包。这在table比较setuptools和pip中被称为 sys.path modification 。这是使用setup.py install而不是使用pip安装时控制台脚本使用用户安装的库的原因。

考虑到以上所有因素,您观察到的原因可能是由以下原因造成的:

  • PYTHONPATH指向具有系统范围安装库的目录
  • 使用sudo python.py install (...)
  • 安装系统范围的库
  • 操作系统以某种方式影响sys.path构建

在第一种情况下,清除PYTHONPATH或将用户安装的库的路径添加到PYTHONPATH的开头应该有帮助。
在第二种情况下,卸载系统范围的库并使用distro软件包管理器安装它们可能会有所帮助(请注意,您永远不应该使用带有pip或setup.py的sudo来安装Python软件包)。 在第三种情况下,有必要了解操作系统如何影响sys.path构造,以及是否有某种方法将用户安装的库置于系统库之前。

您可能对阅读问题pip list reports wrong version of package installed both in system site and user site感兴趣,我问的问题与您基本相同:

  

这是否意味着使用easy_install安装系统范围的Python软件包,因此让他们使用sys.path操作来破坏用户bin目录中的脚本?如果是,有任何解决方法吗?

最后的手段解决方案将在导入这些库之前从脚本中手动将目录/目录与用户安装的库放在sys.path的开头。

话虽如此,如果您的用户不需要直接访问源代码,我建议您使用pexPlatter等工具将您的应用与所有依赖项一起打包到自包含包< / em>的