我想找出一个“万无一失”的安装指令,放入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做那个点不在这里?
(编辑清楚我正在寻找更简单+更安全的安装说明。)
答案 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安装时控制台脚本使用用户安装的库的原因。
考虑到以上所有因素,您观察到的原因可能是由以下原因造成的:
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
的开头。
话虽如此,如果您的用户不需要直接访问源代码,我建议您使用pex或Platter等工具将您的应用与所有依赖项一起打包到自包含包< / em>的