在一个Python环境中维护具有不同版本的软件包

9 浏览
0 Comments

在一个Python环境中维护具有不同版本的软件包

在我的应用程序中,我想使用以下内容:\n

    \n

  • packageA,需要packageX==1.3
  • \n

  • packageB,需要packageX==1.4
  • \n

  • packageX==1.5
  • \n

\n我应该如何使用pip安装多个版本的packageX来处理这种情况?

0
0 Comments

在Python中使用Blender时,我使用了一种不太优雅的解决方法,即安装并将一个类似版本的Python保留在路径之外,并使用subprocess让另一个版本完成所需的工作。如果你除了安装pandas和scipy之外做了其他操作,Blender的Python会变得有点难以预测。我尝试过在Blender中使用虚拟环境,但这往往会导致一些问题。

另外,如果你使用Blender进行数据可视化,你需要在版本号文件夹中添加一个配置文件夹,这样可以将所有的插件添加到该文件夹中,这样做可以使其更加便携,也减少了破坏其他Blender安装的可能性。许多为Blender制作插件的人并不是“程序员”,所以这些熟悉的人经常会做一些非常hackish的事情,而这是我能够使用的最佳解决方法。

另一个解决方法(这个方法有很多限制,我应该被禁止触摸键盘)是手动定位__init__文件,并使用importlib手动将其添加到全局变量中...这样做存在一定的风险。有些模块在这样做时表现正常,而其他模块则会出现问题,这可能导致额外的烦恼。将其限制在相似的版本上可以减少问题,并且我在使用这种方法从虚拟环境中导入模块时运气还不错,但是我在处理Blender的Python时为什么使用subprocess调用就是有原因的。

def importfromfilelocation(x,y,z):
    #"""x = 'tk',y = "tkinter", z =r'C:\pyth"""
    mod_alis = x
    spec = importlib.util.spec_from_file_location(y, z)
    print(spec)
    mod_alis = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(mod_alis)
    globals()[str(x)]= mod_alis

0
0 Comments

在一个Python环境中维护不同版本的包

当我们在Python中使用不同版本的包时,有时候可能会遇到问题。比如,我们可能有一个版本为1.10的包,但是希望切换到开发版本进行一些工作。为了解决这个问题,我们可以按照以下步骤进行操作:

1. 首先,下载每个版本包的源代码,并将它们分别安装在不同的文件夹中。以networkx包为例,我们可以使用以下命令下载开发版本的源代码:

git clone https://github.com/networkx/networkx.git
cd networkx

2. 创建一个文件夹来存放开发版本的包。例如,我们可以使用以下命令创建一个名为`/home/username/opt/python`的文件夹:

mkdir /home/username/opt/python

3. 设置PYTHONPATH环境变量,将其指向新创建的文件夹路径。可以使用以下命令来设置环境变量:

export PYTHONPATH=/home/username/opt/python/lib/python2.7/site-packages/

4. 接下来,使用以下命令安装开发版本的包:

python setup.py install --prefix=/home/username/opt/python

5. 现在,由于PYTHONPATH指向了这个新的site-packages文件夹,当我们在命令行中运行Python并导入新的模块时,它会正常工作。例如:

>>> import networkx as nx
>>> nx.__version__
'2.0.dev_20151209221101'

6. 如果我们希望切换回原来的版本,只需从PYTHONPATH中移除新文件夹的路径即可。

通过将不同版本的包安装在不同的文件夹中,并设置PYTHONPATH环境变量来指向相应的文件夹,我们可以在同一个Python环境下维护不同版本的包。这样,我们可以方便地切换不同版本的包来满足不同的需求。

0
0 Comments

在Python环境中维护具有不同版本的软件包

在Python中,如果我们需要在同一个环境中安装并使用不同版本的软件包,使用pip是无法帮助我们实现的。pip可以让我们指定安装特定的版本,但是它会覆盖掉其他版本。另一方面,使用虚拟环境可以让我们在同一台机器上安装不同版本的软件包,但是不能同时使用它们。

解决这个问题的最佳方法是手动安装两个版本的软件包,并使用不同的名称将它们放在Python路径中。但是,如果两个库期望它们具有相同的名称(并且它们应该具有相同的名称),那么我们将不得不修改它们,以便它们选择它们所需的版本,并使用一些导入别名的方式,例如:

import dependencyname_version as dependencyname

目前没有干净的解决方法,最好的希望是这个hack能够起作用。

我宁愿放弃其中一个库,用一个等效的库替换它,或者修补它以接受新版本的依赖项,并将修补程序提交给社区。

很多编程语言都面临这个问题,比如Java、Go、Haxe等。希望语言设计者们在创建未来的语言时能放弃全局软件包命名空间,并采用更像Node.js的模块系统,因为Node.js支持多个版本的依赖项。

使用Maven或Gradle,你可以安装同一个软件包的两个版本;但是使用pip是不行的。尽管如此,你仍然不能在同一个程序中使用两个版本的同一个软件包。

这个包管理器在版本控制方面做得很愚蠢,当你想要安装多个版本时,它完全忽略了版本控制。哈哈,多么愚蠢啊!

讽刺的是,很多编程语言都宣扬不使用全局变量、过早优化是万恶之源、更多的命名空间等等,然后却在二进制文件中使用全局命名的依赖项。为什么不允许每个部分都使用自己的版本呢?开发人员的便利性大于部署大小,尤其是对于Python来说。

Java没有这个问题。至少在过去的20多年里没有。了解一下Apache Ivy、Apache Maven和Gradle。

Maven是否能够设置一些类加载器的技巧,以便相同软件包的两个版本中的类的完全限定名称不会冲突?

0