【问题标题】:How to tell Python to use 'pip3' if 'pip' isn't available?如果“pip”不可用,如何告诉 Python 使用“pip3”?
【发布时间】:2021-07-01 05:01:06
【问题描述】:

我正在尝试用 Python 构建一个网站制作器,并且它可以工作 - 直到我决定放置声音效果,这需要 playsound。在 StackOverflow 搜索自动安装库后,我找到了答案并将其弹出到 setup.py。然后我在 Windows 中运行代码以检查它是否有效 - 它确实有效,但后来我记得 macOS 和 Linux(根据我的经验)不能使用 pip,它们只能使用 pip3。所以我在设置文件中写了一个例外,所以每当ModuleNotFoundErrorpip 序列中弹出时,它就会使用pip3。然而,我得到的(在 Ubuntu 中)是这样的:

bye@DESKTOP-L5UUI0C:/mnt/f/pythonexperements/webmaker$ python3 1.py
 __          __  _         _ _         __  __       _
 \ \......../ / | |.......(_| |.......|  \/  |.....| |..............
 .\ \../\../ _..| |__  ___ _| |_ ___..| \  / |.__ _| |._____ _ __ ..
 ..\ \/  \/ / _ | '_ \/ __| | __/ _ \.| |\/| |/ _` | |/ / _ | '__|..
 ...\  /\  |  __| |_) \__ | | ||  __/.| |..| | (_| |   |  __| |.....
 ....\/..\/.\___|_.__/|___|_|\__\___|.|_|..|_|\__,_|_|\_\___|_|.....
                                                      by ByeMC; v1.0

Installing required libraries, installing "playsound"
Traceback (most recent call last):
  File "1.py", line 13, in <module>
    from playsound import playsound
ModuleNotFoundError: No module named 'playsound'

During handling of the above exception, another exception occurred: # this is exactly what the terminal produced, please don't edit this line

Traceback (most recent call last):
  File "1.py", line 16, in <module>
    import setup
  File "/mnt/f/pythonexperements/webmaker/setup.py", line 3, in <module>
    import pip
ModuleNotFoundError: No module named 'pip'

程序的主脚本:

[...]
print(asciiart)

try:
    from playsound import playsound
except ModuleNotFoundError:
    print('Installing required libraries, installing "playsound"')
    import setup
    install('playsound')
    print('Install done')


playsound('notif')
[...]

自动安装库的代码:

# Setup files

import pip

depend = ['playsound']

def install(package):
    import importlib
    try:
        importlib.import_module(package)
    except ImportError:
        try:
            import pip
            pip.main(['install', package])
        except ModuleNotFoundError:
            import pip3
            pip3.main(['install', package])
    finally:
        globals()[package] = importlib.import_module(package)


for x in depend:
    install(x)

如果你能帮助我,我会很高兴的。

【问题讨论】:

  • pip3 不是模块。 import pip throwing ModuleNotFoundError 表示 pip 本身没有安装。
  • stackoverflow.com/a/62555575/11138259 -- import subprocess, sys; subprocess.check_call([sys.executable, '-m', 'pip', 'install', package]) -- 不管你想要做什么,似乎都是个坏主意。有更好的方法来解决这个问题。
  • 你应该使用 setuptools 创建一个真实的setup.py 并将playsound 添加到requirements.txt 而不是这些黑客。
  • 抱歉,不清楚您的问题到底是什么。 第三方库是否尝试使用pip?你的代码这样做吗?在后一种情况下,为什么这样做而不是依赖安装后存在的依赖项? pip/pip3 可执行文件实际上是否可用于您正在使用的 python 版本?请注意,许多 Linux 包管理器在没有 pip 的情况下安装系统 python - 这是避免破坏系统库的保护措施。

标签: python python-3.x pip modulenotfounderror


【解决方案1】:

pip 是一个命令行程序。虽然它是在 Python 中实现的,因此可以通过 import pip 从您的 Python 代码中使用,您不得以这种方式使用 pip 的内部 API

  • pip 代码假定它可以单独控制程序的全局状态。 pip 管理诸如日志系统配置或标准 IO 流的值之类的事情,而不考虑用户代码可能受到影响的可能性。

  • pip 的代码不是线程安全的。如果您要在线程中运行 pip,则无法保证您的代码或 pip 会按预期工作。

  • pip 假设一旦完成它的工作,进程就会终止。它不需要处理其他代码将在该点之后继续运行的可能性,因此(例如)在同一进程中调用 pip 两次可能会出现问题。

有关此主题的更多信息:https://pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program

您可以尝试另一种安装模块的方法,可能是这样的:

import subprocess
import sys
subprocess.check_call([sys.executable, "-m", "pip", "install", "module_name"])
import os
os.system('pip install module_name')

如果 pip 不可用,另一种方法是更基本的方法,使用内置模块下载 tar.gz


#python3
import requests

r = requests.get("https://files.pythonhosted.org/packages/4e/0b/cb02268c90e67545a0e3a37ea1ca3d45de3aca43ceb7dbf1712fb5127d5d/Flask-1.1.2.tar.gz",allow_redirects=True)
with open("Flask-1.1.2.tar.gz","wb") as f:
    f.write(r.content)

#python2
import urllib

r = urllib.URLopener()
r.retrieve("https://files.pythonhosted.org/packages/4e/0b/cb02268c90e67545a0e3a37ea1ca3d45de3aca43ceb7dbf1712fb5127d5d/Flask-1.1.2.tar.gz", "Flask-1.1.2.tar.gz")

之后只需将存档和cd 解压到目录中并安装模块python setup.py install --user

【讨论】:

  • 如果pip模块不能被导入,那么它也不能为解释器运行。 sys.executable -m pip ... 也必须导入 pip。
  • 你是对的@MisterMiyagi,在旧系统上我使用了easy_install,但我认为现在它已被弃用,没有pip 我认为唯一的解决方案是下载'tar.gz'并安装手动模块。
猜你喜欢
  • 2021-07-24
  • 2014-07-03
  • 2014-02-25
  • 2017-09-18
  • 2021-06-08
  • 2016-07-01
  • 2023-03-29
  • 2019-10-04
相关资源
最近更新 更多