包都装不上你写个锤子代码,N种姿势教你装包( 二 )


然后你经过调查发现脚本里面要用到一个三方包,但对方的服务器可能装过也可能没装过,于是你在脚本运行初始阶段设置了一个逻辑:
if xxx_package is exist: import xxx start run codeelse: pip install xxx_package import xxx start run code然后你傻乎乎的调用了python的系统命令来执行包的安装操作,诸如os.system/os.popen/subprocess.Popen,发现并没有什么卵用,包确实执行安装了,但是代码初次运行的环境还是检测不到该包的存在,wtf?
经过一番分析发现,安装发生在脚本启动之后,上述安装方法并不会将新安装的包同步至当前的运行过程中,因为python脚本是在启动之初就将import的包导入当前内存中的,也就是说我们新安装的并没有被热更新过来,归根结底是因为动态装包的姿势不对,下面给出动态装包的代码示例,重点在于install函数部分,当年我可是在这个坑了待了好久才出来,说多了都是泪!_!:
import pipdef install(package): if hasattr(pip, 'main'): pip.main(['install', package]) else: pip._internal.main(['install', package])# Exampleif __name__ == '__main__': try: import xxx print('Yeah, the package is here, ready go') # todo run main code except ImportError: print('oh no, it seems like you must install this package then you can use it') install('xxx') # todo run main code4. 写在最后
至此,你已经基本领略了 Python 装包 99% 以上的姿势,可以开开心心的 coding 了 。如果你上面的都看完了,那么可以看下我一开始就想推荐的一篇文章,有点老,但通过了解python包管理工具的历史你对上述内容的理解会更深刻,同时又能体会到今天的世界是多么的美好 。
Python 包管理工具解惑 [3]
当然,对于“包无法安装”这个问题,如果你还有其他更好的解决方案,或者对本文章有批评、指正或疑虑的地方,可在评论中指出,以便于我更新改正,谢谢大家 。




推荐阅读