【问题标题】:pip.main install fails with 'module' object has no attribute 'main'pip.main 安装失败,“模块”对象没有属性“主”
【发布时间】:2018-04-17 05:36:11
【问题描述】:

我正在尝试从 python 脚本中安装一些 python 包,为此我使用pip.main(install)。下面是代码sn-p

try:
    import requests
except:
    import pip
    pip.main(['install', '-q', 'requests==2.0.1','PyYAML==3.11'])
    import requests

我尝试使用从 pip._internal 导入 main 并使用 pipmain 代替 pip.main() 但没有帮助。

我在 pip version 9.0.1python 2.7

【问题讨论】:

  • 您的工作区中是否有一个名为 pip 的文件夹/文件。可能正在导入其他一些模块/文件。检查 pip.__file__ 的输出是什么。它应该指向 pip 的正确位置。
  • @serbia99 我用我自己的python解释器调用了一个脚本,它在内部导入了sn-p之上的模块。所以,我有自己的 pip 和 python
  • 我最近有类似的问题,同样的事情发生在 pip 更新到 10.0.1 之后。我删除了 python/site-packages/pip/__pycache__ 文件夹并将其降级到 9.0.1。它奏效了。你可能想试一试。
  • 谢谢。看起来这是与 pip 版本相关的问题。

标签: python python-2.7 pip


【解决方案1】:

pip.main 函数已被移动,而不是被 pip 开发人员删除。这里投票最高的解决方案并不好。当您可以直接运行 python 代码时,从 python -> shell -> python 不是一个好习惯。试试from pip._internal import main,然后你就可以像以前一样使用那个main函数来执行你的pip调用了。

【讨论】:

    【解决方案2】:

    pip 开发人员不建议从程序中调用 pip。 pip.main() 方法已从 pip v10 中删除。 作为替代方法,建议在子进程中执行 pip。

    https://pip.pypa.io/en/stable/user_guide/?highlight=_internal#using-pip-from-your-program

    try:
        import requests
    except:
        import sys
        import subprocess
        subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'requests==2.0.1', 'PyYAML==3.11'])
        import requests
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,只需运行以下命令即可为我解决:

      easy_install pip
      

      【讨论】:

        【解决方案4】:

        简短的回答是不要这样做。使用setup.py 或直接导入语句。

        Here is why this doesn't work with pip and how to get around it if necessary.

        pip 影响整个环境。根据谁在运行它以及为什么,他们可能希望也可能不希望在运行脚本的环境中安装requests。运行脚本会影响他们的 python 环境可能会令人讨厌。

        将其安装为一个包(使用python setup.pypip install)是另一回事。使用requirements.txtsetup.py 安装其他软件包有很多成熟的方法。还期望安装包将安装其依赖项。 You can read more in the python.org packaging tutorials

        如果您的脚本有依赖项但人们不需要安装它,您应该在README.rst 和/或requirements.txt 中告诉他们。 只需包含 import 语句,当他们得到错误时,他们就会知道该怎么做。让他们控制哪些环境安装哪些包。

        【讨论】:

          【解决方案5】:

          如果需要,您可以定义一个函数来安装库。很方便。

          #%%
          # IMPORTS
          
          import pip
          
          def import_or_install(package):
              try:
                  __import__(package)
              except:
                  import sys
                  import subprocess
                  subprocess.check_call([sys.executable, '-m', 'pip', 'install', package])
                  __import__(package)
          
          import_or_install("numpy")
          import_or_install("matplotlib")
          
          import numpy as np
          import matplotlib.pyplot as plt
          
          
          #%%
          # Your code
          
          print("Hello")
          

          【讨论】:

            猜你喜欢
            • 2015-05-16
            • 1970-01-01
            • 1970-01-01
            • 2019-12-28
            • 2020-12-29
            • 1970-01-01
            • 2019-11-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多