如何使Python包在代码中更新以实时生效
如何使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但这不是我想要的。
问题:
如何在代码中使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
函数卸载它,然后安装同一包的其他版本。
请告诉我是否有效。
如前面的回答和最近的请求所提到的,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两个版本的库,并成功地运行了一些示例代码。