【问题标题】:python3 subprocess pip "ImportError: cannot import name main" in terminal终端中的python3子进程pip“ImportError:无法导入名称main”
【发布时间】:2019-04-13 20:58:06
【问题描述】:

我创建了一个脚本(见下文)来升级我所有的 pip 包。我通过idle3 成功执行了我的脚本,即使用idle3 打开脚本并按F5 将脚本作为模块运行。但是,我无法在终端中执行它;得到以下错误。 我该如何克服这个错误?为什么导入错误发生在终端而不是idle3

$ python3 -m upgrade_pip_packages 
====================================================
UPGRADING ALL --USER PIP PACKAGES TO LATEST VERSION:
====================================================
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main
ERROR: Command 'pip list' returned non-zero exit status 1

我的脚本:upgrade_pip_packages.py

#!/bin/python3
import subprocess
from pprint import pprint


def get_pkgs():
    try:
        cmd = 'pip list'
        completed = subprocess.run( cmd, shell=True, check=True,
                                    stdout=subprocess.PIPE )
    except subprocess.CalledProcessError as err:
        print( 'ERROR:', err )
    else:
        for line in completed.stdout.decode('utf-8').splitlines()[2:]:
            yield line


def update_pkgs(piplist):
    npackages = 0
    nupgrades = 0
    nerrors = 0
    upgradelist = []
    errorlist = []
    for i in piplist:
        npackages += 1
        pkgname, ver = i.split()
        print('\n',pkgname)
        try:
            cmd = 'pip install --user {} --upgrade'.format(pkgname)
            completed = subprocess.run( cmd, shell=True, check=True,
                                        stdout=subprocess.PIPE )
        except subprocess.CalledProcessError as err:
            nerrors += 1
            errorlist.append(pkgname)
            print( 'ERROR: {}'.format(err) )
        else:
            for line in completed.stdout.decode('utf-8').splitlines():
                print(line)
                if 'Successfully installed' in line:
                    nupgrades +=1
                    upgradelist.append(pkgname)
    return npackages, nupgrades, nerrors, upgradelist, errorlist


def main():
    print('====================================================')
    print('UPGRADING ALL --USER PIP PACKAGES TO LATEST VERSION:')
    print('====================================================')
    pip_pkgs = get_pkgs() # created a generator
    npackages, nupgrades, nerrors, upgradelist, errorlist \
               = update_pkgs(pip_pkgs)
    print('\nNo. of --user pip packages = {}'.format(npackages))
    print('No. of upgrades            = {}'.format(nupgrades))
    print('No. of upgrade errors      = {}'.format(nerrors))
    if upgradelist:
        print('Package(s) upgraded:')
        pprint(upgradelist)
    if errorlist:
        print('Package(s) with upgrade error:')
        pprint(errorlist)
    print()


if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python terminal pip subprocess ubuntu-16.04


    【解决方案1】:

    最终upgrade_pip_packages.py

    我在我的问题中找到了answer。本质上,我的脚本必须:

    import sys
    

    并进行以下修改:

    cmd = [sys.executable, '-m', 'pip', 'list'] #Change here
    completed = subprocess.run( cmd,
                                #shell=True, #switch this off
                                check=True,
                                stdout=subprocess.PIPE )
    

    cmd = [sys.executable, '-m', 'pip', 'install', '--user', pkgname, '--upgrade'] #Change here
    completed = subprocess.run( cmd,
                                #shell=True, #switch this off
                                check=True,
                                stdout=subprocess.PIPE )
    

    PyPA documentation解释:

    建议写成 {sys.executable} 而不是普通的 python 为了确保命令在 Python 安装中运行 匹配当前运行的笔记本(可能不一样 python命令引用的python安装)。

    $ pip --version
    pip 18.1 from ~/.local/lib/python3.5/site-packages/pip (python 3.5)
    $ pip3 --version
    pip 18.1 from ~/.local/lib/python3.5/site-packages/pip (python 3.5)
    

    【讨论】:

      猜你喜欢
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      • 2020-05-07
      • 2021-07-30
      • 2022-08-21
      • 1970-01-01
      相关资源
      最近更新 更多