如何在代码中更新Python包以使其生效

2024-04-20 13:20:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码行:

from pip import main as pipmain

# initial installation
pipmain(["install", "pyscenic==0.10.0"])
import pyscenic
pyscenic.__version__

# return 0.10.0
# Some large code here

# second installation
pipmain(["install", "install", "pyscenic==0.10.4"])
import pyscenic
pyscenic.__version__
# still return 0.10.0

# Another large chunk that required new version

在那里,我想在代码中动态升级pyscenic包。 然而,正如我上面提到的,在第二次安装中,版本仍然没有改变。 我希望它会变为0.10.4。我怎样才能做好呢

我也试过了,还是没用:

import os
import importlib
os.system('pip install pyscenic==0.10.0')
import pyscenic
pyscenic.__version__
os.system('pip install pyscenic==0.10.4')
import pyscenic
pyscenic.__version__
importlib.reload(pyscenic)
pyscenic.__version__

在IPython(交互式)上测试的所有代码。 如果我退出IPython并再次进入,它将生效。 但那不是我想要的


Tags: installpip代码fromimportreturnosversion
3条回答

这不是安装软件包的首选方法,即在脚本中安装软件包。即使在更新之后,大多数软件包都具有旧版本中的所有功能,并且由于您的版本更改很小,因此不会产生很多问题

但是,如果要在脚本中安装软件包,可以使用前面提到的os.system,但在安装其他版本之前,请先删除以前的版本,这样就可以开始了

如果这不能解决您的问题,那么您可以查看此代码。这将解决在脚本中安装和卸载软件包的问题

import subprocess
import sys

def install(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", package])

def uninstall(package):
    subprocess.check_call([sys.executable, "-m", "pip", "uninstall", package])

一定要让我知道它是否有效

正如前面的几个答案(12)和recent requests所提到的,pip和Python并没有真正考虑到这一点

但是,通过对Python名称系统的巧妙破解,以及对您想要使用的软件包的一些了解,您可以安装两个相邻的版本:

# Copyright © 2021 Alexander L. Hayes
# MIT License

git clone git@github.com:aertslab/pySCENIC pySCENIC100
git clone git@github.com:aertslab/pySCENIC pySCENIC104

(
  cd pySCENIC100
  git checkout 0.10.0
  sed -i "s/pyscenic/pyscenic100/g" setup.py
  sed -i "s/pyscenic/pyscenic100/g" MANIFEST.in
  sed -i "s/pyscenic/pyscenic100/g" setup.cfg
  (
    cd src
    mv pyscenic pyscenic100
    (
      cd pyscenic100
      sed -i "s/pyscenic/pyscenic100/g" binarization.py
      sed -i "s/pyscenic/pyscenic100/g" __init__.py
      sed -i "s/pyscenic/pyscenic100/g" _version.py
    )
  )
  python setup.py install
)

(
  cd pySCENIC104
  git checkout 0.10.4
  sed -i "s/pyscenic/pyscenic104/g" setup.py
  sed -i "s/pyscenic/pyscenic104/g" MANIFEST.in
  sed -i "s/pyscenic/pyscenic104/g" setup.cfg
  (
    cd src
    mv pyscenic pyscenic104
    (
      cd pyscenic104
      sed -i "s/pyscenic/pyscenic104/g" binarization.py
      sed -i "s/pyscenic/pyscenic104/g" __init__.py
      sed -i "s/pyscenic/pyscenic104/g" _version.py
      (
        cd cli
        sed -i "s/pyscenic/pyscenic104/g" *.py
      )
    )
  )
  python setup.py install
)

此bash脚本克隆存储库两次,签出版本0.10.00.10.4,通过sed进行重命名,最后安装两个名为pyscenic100pyscenic104的库:

import pyscenic100
import pyscenic104

print(pyscenic100.__version__)
print(pyscenic104.__version__)
# 0.10.0+0.g3de37cb.dirty
# 0.10.4+0.g436561f.dirty

我不知道在“# Some large code here”期间会发生什么,但它看起来像是文档/测试工作中的示例:

from pyscenic100.featureseq import Feature as Feature100
from pyscenic104.featureseq import Feature as Feature104


f1 = Feature100.from_string('chr1 12 50 feature1 10.0 +')
f2 = Feature100.from_string('chr1 40 60 feature2 10.0 -')
print(f1.has_overlap_with(f2))
# True

f1 = Feature104.from_string('chr1 12 50 feature1 10.0 +')
f2 = Feature104.from_string('chr1 40 60 feature2 10.0 -')
print(f1.has_overlap_with(f2))
# True

如果能够,一个简单的解决方案是编写一个按顺序运行两个python文件的bash文件,在两个python运行之间使用pip更改包pyscient的版本。您可以执行类似于this的操作,例如:

#!/usr/bin/env bash
pip install pyscenic==0.10.0
python first_script.py
pip install pyscenic==0.10.4
python second_script.py

相关问题 更多 >