by dongye
Pycharm 或其他带有包管理功能的python IDE在升级 pip 19.3.1 后 安装package可能会出现如下错误
Traceback (most recent call last):
File "D:\Program Files\JetBrains\PyCharm Community Edition 2017.3.3\helpers\packaging_tool.py", line 217, in main
retcode = do_install(pkgs)
File "D:\Program Files\JetBrains\PyCharm Community Edition 2017.3.3\helpers\packaging_tool.py", line 131, in do_install
return main(['install'] + pkgs)
TypeError: 'module' object is not callable
解决办法:
打开 Pycharm 安装目录下 helpers\packaging_tool.py
文件(或其他IDE相应报错文件)
找到报错函数do_install
和do_uninstall
def do_install(pkgs):
try:
try:
from pip._internal import main
except Exception:
from pip import main
except ImportError:
error_no_pip()
return main(['install'] + pkgs)
def do_uninstall(pkgs):
try:
try:
from pip._internal import main
except Exception:
from pip import main
except ImportError:
error_no_pip()
return main(['uninstall', '-y'] + pkgs)
# Fix Error module 'pip' has no attribute 'main'
或更早版本会报module 'pip' has no attribute 'main'
的代码
def do_install(pkgs):
try:
import pip
except ImportError:
error_no_pip()
return pip.main(['install'] + pkgs)
def do_uninstall(pkgs):
try:
import pip
except ImportError:
error_no_pip()
return pip.main(['uninstall', '-y'] + pkgs)
将 from pip._internal import main
改为 from pip._internal.main import main
也可直接复制下段代码进行替换
def do_install(pkgs):
# author: Dongye<dongye_bio@qq.com>
try:
try:
from pip._internal.main import main
except Exception:
from pip import main
except ImportError:
error_no_pip()
return main(['install'] + pkgs)
def do_uninstall(pkgs):
try:
try:
from pip._internal.main import main
except Exception:
from pip import main
except ImportError:
error_no_pip()
return main(['uninstall', '-y'] + pkgs)
原因分析:
pip 10 版本时变更了目录结构
在pip 10.x.x 中将main方法从pip\__init__.py#209
移动到
pip\_internal\__init__.py#53
中
...
# Hide the InsecureRequestWarning from urllib3
warnings.filterwarnings("ignore", category=InsecureRequestWarning)
def main(args=None):
if args is None:
args = sys.argv[1:]
# Configure our deprecation warnings to be sent through loggers
deprecation.install_warning_logger()
...
因此在 9.x.x 过渡到 10.x.x 时会报 module 'pip' has no attribute 'main'
错误
而在pip 19.3.1中又将main方法移动到pip\_internal\main.py#22
中
此时from pip._internal import main
的main
是“包”而不是“方法”,因此报错'module' object is not callable
, 将其修改为from pip._internal.main import main
即可正常工作
附:Pycharm安装pip失败问题
在Pycharm中使用virtualenv创建环境,pip默认会是较低版本,使用图形化工具无法进行升级,替换方法在Terminal中使用
python -m pip install --upgrade -i https://pypi.douban.com/simple pip
进行安装,命令需要执行两次
网友评论