3

我想找出一个“万无一失”的安装说明,将其放入 Python 项目的 README 中,调用它footools,以便我们组中的其他人可以在他们的笔记本电脑和服务器帐户上安装它的最新 SVN 版本。

问题是在调用 pip 安装的脚本时,让 Python 使用用户安装的库。例如,我们使用的服务器在/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 .运行主入口脚本,它会使用其中的文件.——这不是我想要的,用户应该能够删除源目录(并且能够在不影响他们的情况下进行 svn安装)。


我可以使用(并推荐其他人使用)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 在做什么,pip 在这里没有做什么?

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

4

2 回答 2

3

安装virtualenvwrapper. 我允许设置单独的 python 环境来缓解您可能遇到的任何冲突。这是安装和使用 virtualenv 的教程

有关的:

于 2014-12-12T14:58:50.077 回答
1

pip 在安装过程中生成的控制台脚本应根据 PEP 370 使用用户安装的库版本:

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

边注


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


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

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

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

您可能有兴趣阅读问题pip list 报告安装在系统站点和用户站点中的软件包版本错误,我问的问题与您基本相同:

这是否意味着使用 easy_install 安装系统范围的 Python 包,从而让它们使用 sys.path 操作会破坏用户 bin 目录中的脚本?如果是这样,有什么解决方法吗?

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

话虽如此,如果您的用户不需要直接访问源代码,我建议您使用pexPlatter等工具将您的应用程序与所有依赖项打包成独立的bundle

于 2016-06-27T20:08:33.647 回答