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

6 浏览
0 Comments

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

我有以下代码行:\n

from pip import main as pipmain
# 初始安装
pipmain(["install", "pyscenic==0.10.0"])
import pyscenic
pyscenic.__version__
# 返回0.10.0
# 这里有一些庞大的代码
# 第二次安装
pipmain(["install", "install", "pyscenic==0.10.4"])
import pyscenic
pyscenic.__version__
# 仍然返回0.10.0
# 另一个需要新版本的庞大代码块

\n在这里,我想在我的代码中即时升级pyscenic软件包。\n然而,如我上面所述,在第二次安装中版本仍然没有改变。\n我期望它改变为0.10.4。我该如何正确地做到这一点?\n我也尝试了这个,仍然没有效果:\n

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__

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

0
0 Comments

问题的原因是:需要在代码中更新Python包以便实时生效,但目前的方法无法实现这一点。

解决方法是:编写一个bash文件,在两个Python文件之间按顺序运行,使用pip在两个Python运行之间更改pyscenic包的版本。可以像下面这样实现:

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

0
0 Comments

问题:

如何在代码中使Python包更新以实时生效?

原因:

在脚本内部安装包不是首选的安装包方式。大多数包即使更新后,仍具有旧版本中的所有功能,而且由于您的版本更改很小,不应该产生太多问题。

但是,如果您想在脚本内部安装包,可以使用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])

他可以使用install函数安装指定版本的包,然后使用uninstall函数卸载它,然后安装同一包的其他版本。

请告诉我是否有效。

0
0 Comments

如前面的回答和最近的请求所提到的,pip和Python并没有真正考虑到这一点。但是通过对Python的名称系统进行一些巧妙的黑客攻击,并且了解您想要使用的软件包,您可以在一起安装两个版本。

这个Bash脚本克隆了存储库两次,分别检出版本0.10.0和0.10.4,通过sed进行一些重命名,最后安装了两个名为pyscenic100和pyscenic104的库。

# 版权所有  2021 Alexander L. Hayes
# MIT许可证
git clone git.com:aertslab/pySCENIC pySCENIC100
git clone git.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
)

这个脚本克隆存储库两次,检出版本0.10.0和0.10.4,通过sed进行一些重命名,并最终安装了两个名为pyscenic100和pyscenic104的库。

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

这段代码导入了pyscenic100和pyscenic104两个版本的库,并成功地运行了一些示例代码。

0