Answers:
您应该在grep中使用pip
的list
命令,该命令仅列出已安装的软件包(也不列出所有模块及其邻居):
pip list | grep -F package_name
如果package_name与多个已安装的软件包匹配,例如搜索boto
何时botocore
安装,则使用@ -w
代替-F
,如@TaraPrasadGurung所示。这并未列出确切的软件包,因为-w
将软件包名称中常见的字符视为单词边界。所以,如果你必须 requests
和requests-cache
安装或ruamel.yaml
与ruamel.yaml.cmd`和需求恰好一行输出你需要做的是这样的:
pip list --disable-pip-version-check | grep -E "^ruamel\.yaml "
请注意,由于.
使用时可以匹配任何字符-E
,因此您需要对其进行转义。¹
¹ 是的,因为有包装,所以这是必需的ruamel_yaml
。pip
处理名称空间包时,并非每个包管理器都兼容。
-w
视为单词边界,并且在包装名称中很常见。当我使用您的建议时,如果我使用grep -w ruamel.yaml
或grep -w request
pip list | grep -F mxnet-cu101
打印mxnet-cu101 1.5.0
,但不完全安装它的位置。任何想法如何获得安装路径?`
我发现现有答案不完整,也没有足够好的例子。这是我确定的解决方案:
# 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
您也可以在脚本中使用类似的内容。
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中工作,然后根据退出代码进行安装。
我在脚本中使用了稍严格一点的Anthon答案:
pip3 list |
grep -v "^Package *Version$" | grep -v "^-*$" |
cut -d ' ' -f 1 |
grep -xF "$package_name"
前两次抓取旨在从pip3的输出中删除标题行。
然后,剪切仅选择软件包名称(放弃版本号)。
然后,最终的grep可以对相关内容进行精确搜索 $package_name
如果找到该软件包,它将显示该软件包的名称,并以退出代码0返回。如果您不想看到该软件包的名称,请以以下命令结束 >/dev/null
pip install
。如果已经安装,则不会再次安装。