我想为我的代码安装模块'mutagen'和'gTTS',但我想拥有它,所以它会在没有它们的每台计算机上安装模块,但它不会尝试如果已安装它们,请安装它们。我目前有:
def install(package):
pip.main(['install', package])
install('mutagen')
install('gTTS')
from gtts import gTTS
from mutagen.mp3 import MP3
但是,如果你已经拥有这些模块,只要你打开它就会给程序的开头添加不必要的混乱。
答案 0 :(得分:10)
要检查包是否存在,并在后一种情况下安装,请尝试使用pip
模块。
要隐藏输出,您需要为其创建一个函数(来自此post中的代码):
from contextlib import contextmanager
import sys, os
@contextmanager
def suppress_stdout():
with open(os.devnull, "w") as devnull:
old_stdout = sys.stdout
sys.stdout = devnull
try:
yield
finally:
sys.stdout = old_stdout
import pip
required_pkgs = ['mutagen', 'gTTS']
installed_pkgs = [pkg.key for pkg in pip.get_installed_distributions()]
for package in required_pkgs:
if package not in installed_pkgs:
with suppress_stdout():
pip.main(['install', package])
或者另一种方法是使用简单的try
except
:
import pip
pkgs = ['mutagen', 'gTTS']
for package in pkgs:
try:
import package
except ImportError, e:
pip.main(['install', package])
就像@zwer提到的那样,上述工作虽然没有被视为打包项目的正确方法。要更深入地查看此内容,请阅读页面How to package a Python App。
答案 1 :(得分:8)
您可以使用try / except:
try:
import time
print("module 'time' is installed")
except ModuleNotFoundError:
print("module 'time' is not installed")
答案 2 :(得分:2)
另一种解决方案是为您尝试导入try / except块的任何内容添加import语句,因此如果它已经安装了,但如果没有,它会抛出异常并且您可以运行命令来安装它。
答案 3 :(得分:1)
您可以使用命令行:
python -m MyModule
它会说模块是否存在
否则你可以简单地使用最佳实践:
pip freeze> requirements.txt
这会将你在python上安装的模块放在一个文件
中和:
pip install -r requirements.txt
加载它们
它将自动为您服务
玩得开心
答案 4 :(得分:0)
pip list | grep <module_name_you_want_to_check>
以上为答案,其中:
pip list
列出所有模块,然后
grep <module_name_you_want_to_check>
从列表中找到关键字。为我工作。
答案 5 :(得分:0)
您可以使用pkg_resources.get_distribution
检查软件包是否安装:
import pkg_resources
for package in ['mutagen', 'gTTS']:
try:
dist = pkg_resources.get_distribution(package)
print('{} ({}) is installed'.format(dist.key, dist.version))
except pkg_resources.DistributionNotFound:
print('{} is NOT installed'.format(package))
注意:您不应直接将pip
模块作为pip
命令的it is an unsupported use-case导入。
recommended way of using pip
from your program使用subprocess
执行它:
subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'my_package'])
答案 6 :(得分:0)
您可以运行 pip show package_name
或广角use pip list
Reference