如何检查python3中是否已安装模块或软件包?


Answers:


3

在外壳中输入:pydoc modules
这将列出模块,您可以grep您想要的模块。
此处找到stackoverflow


11

您应该在grep中使用piplist命令,该命令仅列出已安装的软件包(也不列出所有模块及其邻居):

pip list | grep -F package_name

如果package_name与多个已安装的软件包匹配,例如搜索boto何时botocore安装,则使用@ -w代替-F,如@TaraPrasadGurung所示。这并未列出确切的软件包,因为-w将软件包名称中常见的字符视为单词边界。所以,如果你必须 requestsrequests-cache安装或ruamel.yaml与ruamel.yaml.cmd`和需求恰好一行输出你需要做的是这样的:

pip list --disable-pip-version-check | grep -E "^ruamel\.yaml "

请注意,由于.使用时可以匹配任何字符-E,因此您需要对其进行转义。¹


¹ 是的,因为有包装,所以这是必需的ruamel_yamlpip处理名称空间包时,并非每个包管理器都兼容。


问题是如果安装了软件包名称boto和botocore,它将列出这两个软件包。因此,更好的解决方案是使用-w标志而不是-F列出确切的软件包
Tara Prasad Gurung,

@TaraPrasadGurung尽管这样做可以帮助减少输出,但是并不能如您所愿地获得确切的软件包。例如,点和破折号被-w视为单词边界,并且在包装名称中很常见。当我使用您的建议时,如果我使用grep -w ruamel.yamlgrep -w request
Anthon,

pip list | grep -F mxnet-cu101打印mxnet-cu101 1.5.0,但不完全安装它的位置。任何想法如何获得安装路径?`
阿努

@any是的,鉴于我知道它的名称,我对如何检索Python软件包的安装位置有一个好主意。您应该在此网站上发布问题,并在此处向我查询,以引起我的注意,因为我不会关注U&L上新发布的问题。
Anthon

4

如果该软件包在导入时没有做任何疯狂或耗时的操作,则可以尝试实际导入它:

if python -c "import package_name" &> /dev/null; then
    echo 'all good'
else
    echo 'uh oh'
fi

2

我发现现有答案不完整,也没有足够好的例子。这是我确定的解决方案:

# an example checking if the pandas package is installed
if python -c 'import pkgutil; exit(not pkgutil.find_loader("pandas"))'; then
    echo 'pandas found'
else
    echo 'pandas not found'
fi

可以在以下位置找到此示例的Github要点:https : //gist.github.com/shaypal5/d505af9953cd86f59c750fa600ee4ba6


这看起来确实类似于现有答案
Jeff Schaller

1
bash代码相似,Python代码不同,这有很大的不同。在选择添加自己的答案之前,我已经阅读了所有现有答案,并且您链接的特定答案对我不起作用。因此,我觉得在这里添加我的答案是有意义和有价值的。:)
ShayPal5 '18

1

您也可以在脚本中使用类似的内容。

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"

未安装软件包时会得到什么。

Package=psutil
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
1

安装软件包后会得到什么。

Package=requests
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
0

在python2和python3中工作,然后根据退出代码进行安装。


0

我在脚本中使用了稍严格一点的Anthon答案:

pip3 list |
    grep -v "^Package *Version$" | grep -v "^-*$" |
    cut -d ' ' -f 1 |
    grep -xF "$package_name"

前两次抓取旨在从pip3的输出中删除标题行。

然后,剪切仅选择软件包名称(放弃版本号)。

然后,最终的grep可以对相关内容进行精确搜索 $package_name

如果找到该软件包,它将显示该软件包的名称,并以退出代码0返回。如果您不想看到该软件包的名称,请以以下命令结束 >/dev/null



0

经过pip3测试:

$> pip3 show MODULENAME

如果安装了模块,则退出代码($?)为“ 0”,否则为“ 1”。

抓取存在“误报”问题:a的输出

pip list | grep NAME

将在名称包含“ NAME”的任何模块上匹配,例如,也匹配“ some_other_NAME”。

pip3 show MODULENAME

仅在完全匹配时匹配。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.