如何检查模块是否安装在Python中,如果没有,如何在代码中安装?
我想为我的代码安装“诱变剂”和“GTT”模块,但我想让它在每台没有它们的计算机上安装模块,但如果它们已经安装,它不会尝试安装它们。我目前有:如何检查模块是否安装在Python中,如果没有,如何在代码中安装?,python,python-3.x,module,python-module,Python,Python 3.x,Module,Python Module,我想为我的代码安装“诱变剂”和“GTT”模块,但我想让它在每台没有它们的计算机上安装模块,但如果它们已经安装,它不会尝试安装它们。我目前有: def install(package): pip.main(['install', package]) install('mutagen') install('gTTS') from gtts import gTTS from mutagen.mp3 import MP3 但是,如果您已经有了这些模块,那么每当您打开程序时,这只会给程序的
def install(package):
pip.main(['install', package])
install('mutagen')
install('gTTS')
from gtts import gTTS
from mutagen.mp3 import MP3
但是,如果您已经有了这些模块,那么每当您打开程序时,这只会给程序的开头增加不必要的混乱。您可以使用命令行:
python -m MyModule
它将显示模块是否存在
否则,您可以简单地使用最佳实践:
pip freeze>requirements.txt
这将把python安装中的模块放在一个文件中
以及:
pip安装-r requirements.txt
加载它们
它会自动为你的目的
玩得开心编辑-2020/02/03 自从我发布这个答案以来,
pip
模块已经更新了很多。我已经用正确的方法更新了代码段,以安装缺少的依赖项,即使用子流程
和pkg_资源
,而不是pip
要隐藏输出,可以将子流程输出重定向到devnull:
导入系统
导入子流程
导入pkg_资源
必需={'诱变剂','gTTS'}
installed={pkg.key for pkg in pkg_resources.working_set}
缺失=必需-已安装
如果丢失:
python=sys.exe
subprocess.check_调用([python,'-m',pip',install',*missing],stdout=subprocess.DEVNULL)
正如@zwer所提到的,上面的方法是有效的,尽管它不被认为是打包项目的合适方法。要更深入地了解这一点,请阅读该页。另一种解决方案是,将尝试导入的内容的导入语句放入try/except块中,这样,如果它工作,则会安装,如果不工作,则会引发异常,您可以运行命令来安装它。如果您想知道是否安装了包,您可以使用以下命令在终端中进行检查:
pip list | grep <module_name_you_want_to_check>
列出Python中安装的所有模块
竖条通常被称为“管道”。它用于将一个命令传递到另一个命令。也就是说,它将第一个命令的输出定向到第二个命令的输入
grep <module_name_you_want_to_check>
列出以“quant”(例如“quantstrats”)开头的所有包。如果没有任何输出,则表示未安装库。您可以使用以下方法检查是否安装了软件包:
导入pkg\u资源
对于[‘诱变剂’、‘gTTS’中的包装:
尝试:
dist=pkg\u资源。获取\u分发(包)
打印({}({})已安装。格式(dist.key,dist.version))
除pkg_resources.DistributionNotFound外:
打印({}未安装。格式(包))
注意:从pip
命令开始,您不应该直接导入pip
模块
其目的是通过以下方式执行:
subprocess.check_调用([sys.executable,'-m',pip',install',my_package'])
您可以使用try/except:
试试看:
导入时间
打印(“安装了“时间”模块”)
除ModuleNotFoundError外:
打印(“未安装模块“时间”)
#或
安装(“时间”)#问题中的安装功能
如果您想预览是否安装了特定的软件包(或某些软件包),您可以在python中使用idle。
具体而言:
上面是用python 3.9.0测试的您可以运行
pip show package\u name
或者对于大视图使用pip列表
是否希望python脚本运行执行安装检查和安装的命令?或者,您可以在所有这些“计算机”上执行shell命令吗?虽然您可以从技术上强制从脚本中安装模块,但不要这样做,这是一种不好的做法,如果您这样做,人们将不可避免地讨厌您。相反,请学习如何正确打包和分发Python应用程序:@zwer是正确的。不要这样做。如果您的包有依赖项,让
pip
处理它。可能的重复:这很好,但它会给出“需求已经满足”的输出,当您打开它时,会给代码的开头添加不必要的混乱。是否有任何方法使其不响应“已满足的要求”?请添加免责声明,即当有人在其代码中使用import pip
作为正确包装的解决方法时,小猫会死亡-_-@对不起,我的意思是该列表由“EggInfoDistribution”(以及DistINfoDistribution)组成,它们是pip库的一部分。例如,在我的例子中,列表中的第一项是“xmltodict 0.10.2”,但pip中的“xmltodict 0.10.2”。get_installed_distributions()
返回False,而str中的“xmltodict 0.10.2”返回False(pip.get_installed_distributions())
返回True@dcoles感谢您提出这个问题,我已经将代码片段改为使用子流程而不是pip
。另外,我建议您不要使用而不是重定向sys.stdout
,只使用忽略pip
的stdout。请添加一些脚本,而不仅仅是代码块这完全不是answer因为问题是如何安装,以及如何从代码中完成所有这些…“start with”从技术上讲应该是“contains”…grep“\wquant”或grep“^quant”更准确。在Windows上,我还需要grep-E来表示扩展正则表达式。我认为这个问题意味着Python代码将在运行它的每台计算机上安装模块
grep <module_name_you_want_to_check>
pip list| grep quant