语境
个人背景:
缺乏经验的Linux用户,正在学习Python,希望将其应用于NoSQL数据库上的自然语言处理。
为什么选择 GNU/Linux:
我的预算很少,我的旧设备根本没有坏,但无法承受 Windows 给它带来的负担。尝试花钱从制造商那里购买新的顶级工作站,这些制造商曾经在质量、保证、文档和良好的售后服务方面享有盛誉。经历过类似的事情这。不再这样做了。 GNU/Linux 是可定制的,并且通过正确的配置,它非常轻量级。
设置:
我已经让其中一个运行 MX-19 和 Fluxbox 作为“桌面环境”,另一个运行 Fedora 34 和 LXQT,我正在考虑使用 Arch 或 Gentoo 设置另一个,据我所知,尽管时间- 消耗,安装这些将使我能够很好地理解类似 UNIX 的架构,并真正根据我的机器定制东西。我爱上 Linux 就像 Sam Vimes 爱上 Lady Sybil 一样 - 一开始只是为我能得到的东西而感到高兴,但我了解得越多,我就越爱。
不过,它并不是完全没有冲突,没有双关语的意思。
GNU/Linux 发行版的问题加剧了 Python 的问题:
我根据需要使用的大多数应用程序和库都是基于 Python 的软件包,但它们并不总是包含在发行版授权的存储库中,而且它们也不总是最新的(如果包含的话)。
除了我的工作之外,这也适用于我的最爱 ProtonVPN 客户端和 ProtonMail 桥接器。我将它们安装在我拥有的每个系统中。在 Windows 和 Android 上,这很简单,Debian 和 Fedora 都支持 rpm,但他们的 fork 发行版不一定这样做。所以我不得不采取下一个最好的办法:
从 PyPI 安装和从源安装:
所以我一直使用 PyPI 安装
pyton3 -m pip install <packagename>
如果软件制造商没有更新他们的 PyPI 副本,或者更新他们的一个软件而不是另一个,而它们都依赖于同一库的不同版本,则会产生依赖冲突......好吧,我需要从源代码编译。我克隆 git,cd 到源的根目录,然后运行:
pyton3 -m pip install .
依赖管理问题:Python 和 pip 的特例:
- 今年是 python 2.7 和 python 3 之间的痛苦过渡...我们已经达到了 9 分,11 分正在讨论中,pip 同样频繁更新,如果不是最新的,则会不断警告您。
- 与此同时,许多开发人员有过于严格的要求:“我的软件需要这个包的这个特定版本 - 不是‘晚于’,不,是这个”或“不更新于”。典型的解决方案:使用虚拟环境。有两个问题:
- 为每个包建立虚拟环境很难跟踪和管理,而且我的旧设备的驱动器和 RAM 有限,我不能轻率使用。
- 决定将哪些包放入虚拟环境中以及哪些不放入虚拟环境本身就是一个耗时的问题。
- 即使使用 venv,如果包的依赖树包含矛盾,您也可能会陷入无限循环,pip 安装一个包的升级,而另一个包的升级需要另一个包的降级,而 pip 又会想要升级,这将导致与第一个等等
- 例如,某个包具有 RequirementA < 2.1.5 和 RequirementB >2.3,但 2.1.5 之前的 A 版本需要 C < 4.1,而 B > 2.4 的版本需要 C > 5.2。 C 不能 > 5.2 且 < 4.1。它可以变成有点喜剧套路。
正确的问题:
我已经想出了一些目前看来有效的方法,我将在下面作为答复,但我不确定我做得很好。它应该很容易实现自动化,使用一些 bash 脚本、管道、正则表达式......但是,在我致力于这种特定方法并使其系统化之前,我想听听经验丰富的 Linux 用户的意见。根据您的判断,什么是一种方法:
a) 理想地利用 GNU/Linux 的独特优势,同时
b) 不会搞乱可能使用的任何特定发行版,
c) 算法合理且执行安全 d) 可以合理地自动化进行无人值守升级,以及 e )这会检查一路上的错误并允许我将它们带回来?
- 尤其是从源代码安装时,通常需要从 PyPl 获取所需的依赖项。
答案1
临时解决方案:
经过多次尝试和错误,并通过使用 pip 作为 sudo 无可挽回地破坏了我的一个发行版,我终于找到了一种方法。通过探索 pip 选项的帮助指南,我发现可以遵循这条路线,这并没有给我带来问题然而:
检查所有可升级包:
python3 -m pip list --outdated --verbose
检查所有需求冲突:
python3 -m pip check --verbose
虽然存在需求冲突,因为软件包比所需的版本旧或根本没有安装,但请安装它,没有依赖关系,然后,返回到 2。如果所有要求冲突都是因为安装的软件包对于要求来说太新,请转到步骤 4。
python3 -m pip install --no-dependencies --verbose <package-name>
重新检查第 1 阶段,然后升级一个可升级的软件包,没有依赖关系,然后重复第 2-3 阶段循环,直到回到第 4 阶段。重复这个更广泛的循环,直到 a) 不再有任何可升级的软件包,b) 所有已安装软件包所需的依赖项均已安装,并且是最近的足够了或者-“太新了”。
今天就到此为止,继续下一个任务,想知道是否
a) 这可能会导致问题并可能破坏我的系统,b) 我可以安全地将这个简单的算法编写成循环
回溯错误的能力:
我还不知道哪些州需要回程,但我知道它们会存在。
这就是为什么我上面写的所有命令都是 --verbose,这样我可以收集的所有信息(希望比我需要的更多)都显示在控制台中,以便我存储在历史记录中。到目前为止我已经精心完成了
history >> ~/Documents/shell_histories/2021_mm_dd_pip_<upgrades,sourceinstalls,etc.>.txt
但我还不知道如何处理这些日志。
你有什么建议?我的方法是正确的还是鲁莽的?不管怎样,我怎样才能做得更好?