一次安装Python插件mysqlclient受到的启发

文章讲述了在Ubuntu22.04系统中,使用Python3.11和PyCharm时遇到安装mysqlclient库的依赖问题。作者通过逐步排查,发现并解决了pkg-config和libpython3.11-dev的缺失问题,强调了解决开源软件依赖和版本问题的重要性,以及处理这类问题时应具备的技巧和习惯,包括理解错误信息、独立思考、有效查询资源和提问等。
摘要由CSDN通过智能技术生成

首先,我也是Python的初学者,环境是ubuntu22.04+pycharm,都安装好了以后,我打开了一个原来编辑过的项目,在新环境中提示没有安装mysqlclient,于是我就pip install mysqlclient,就有了以下的报错信息:

$ pip install mysqlclient
Defaulting to user installation because normal site-packages is not writeable
Collecting mysqlclient
  Using cached mysqlclient-2.2.0.tar.gz (89 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... error
  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─> [27 lines of output]

      /bin/sh: 1: pkg-config: not found
      /bin/sh: 1: pkg-config: not found
      Trying pkg-config --exists mysqlclient
      Command 'pkg-config --exists mysqlclient' returned non-zero exit status 127.
      Trying pkg-config --exists mariadb
      Command 'pkg-config --exists mariadb' returned non-zero exit status 127.
      Traceback (most recent call last):
        File "/home/jarry/.local/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module>
          main()
        File "/home/jarry/.local/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main
          json_out['return_val'] = hook(**hook_input['kwargs'])
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/home/jarry/.local/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 118, in get_requires_for_build_wheel
          return hook(config_settings)
                 ^^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-xnpvipsh/overlay/local/lib/python3.11/dist-packages/setuptools/build_meta.py", line 341, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=['wheel'])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-xnpvipsh/overlay/local/lib/python3.11/dist-packages/setuptools/build_meta.py", line 323, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-xnpvipsh/overlay/local/lib/python3.11/dist-packages/setuptools/build_meta.py", line 338, in run_setup
          exec(code, locals())
        File "<string>", line 154, in <module>
        File "<string>", line 48, in get_config_posix
        File "<string>", line 27, in find_package_name
      Exception: Can not find valid pkg-config name.
      Specify MYSQLCLIENT_CFLAGS and MYSQLCLIENT_LDFLAGS env vars manually
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

× Getting requirements to build wheel did not run successfully.
│ exit code: 1
╰─> See above for output.

note: This error originates from a subprocess, and is likely not a problem with pip.

可以看出其中有两处标红的很明显的错误,第一处错误有明确的提示,缺少pkg-config,所以我就安装:

$ sudo apt-get install pkg-config
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成                 
下列【新】软件包将被安装:
  pkg-config
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 1 个软件包未被升级。
需要下载 48.2 kB 的归档。
解压缩后会消耗 134 kB 的额外空间。
获取:1 http://archive.ubuntu.com/ubuntu jammy/main amd64 pkg-config amd64 0.29.2-1ubuntu3 [48.2 kB]
已下载 48.2 kB,耗时 1秒 (40.3 kB/s)  
正在选中未选择的软件包 pkg-config。
(正在读取数据库 ... 系统当前共安装有 230144 个文件和目录。)
准备解压 .../pkg-config_0.29.2-1ubuntu3_amd64.deb  ...
正在解压 pkg-config (0.29.2-1ubuntu3) ...
正在设置 pkg-config (0.29.2-1ubuntu3) ...
正在处理用于 man-db (2.10.2-1) 的触发器 ...

然后再次pip install mysqlclient,第一处的错误消失了,至于第二个地方note: This error originates from a subprocess, and is likely not a problem with pip.这里提示很模糊,就说了可能是子进程的问题,并且可能不是pip的问题,以前在Linux中也遇到过类似的事情,多数由于依赖问题导致,但是具体是什么的依赖,没有描述,这就需要思考了。

我们要安装mysqlclient,有可能是它的依赖包,但前面还有一句Building wheel for mysqlclient (pyproject.toml) ... error,所以也有可能是wheel的依赖包,也有可能是一些很基础的依赖包,比如gcc或者什么的,查资料吧!

于是:

sudo apt-get install default-libmysqlclient-dev build-essential

结果说我的build-essential是最新的,给我安装了default-libmysqlclient-dev,但是问题没有解决,然后继续找...

查了mysqlclient的依赖包,查了python的依赖包,过程非常艰苦,忽然我想起来一个问题,我的系统中有两个版本的Python,3.10和3.11,那些依赖包虽然都是最新的,但是是不是跟我Pycharm使用的Python3.11不合适呢?于是,知道我安装了libpython3.11-dev后,问题解决了:

$ sudo apt-get install libpython3.11-dev
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成                 
将会同时安装下列软件:
  libpython3.11
下列【新】软件包将被安装:
  libpython3.11 libpython3.11-dev
升级了 0 个软件包,新安装了 2 个软件包,要卸载 0 个软件包,有 1 个软件包未被升级。
需要下载 7,521 kB 的归档。
解压缩后会消耗 33.3 MB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu jammy/main amd64 libpython3.11 amd64 3.11.4-1+jammy1 [2,213 kB]
获取:2 https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu jammy/main amd64 libpython3.11-dev amd64 3.11.4-1+jammy1 [5,309 kB]
已下载 7,521 kB,耗时 17秒 (435 kB/s)                                          
正在选中未选择的软件包 libpython3.11:amd64。
(正在读取数据库 ... 系统当前共安装有 230163 个文件和目录。)
准备解压 .../libpython3.11_3.11.4-1+jammy1_amd64.deb  ...
正在解压 libpython3.11:amd64 (3.11.4-1+jammy1) ...
正在选中未选择的软件包 libpython3.11-dev:amd64。
准备解压 .../libpython3.11-dev_3.11.4-1+jammy1_amd64.deb  ...
正在解压 libpython3.11-dev:amd64 (3.11.4-1+jammy1) ...
正在设置 libpython3.11:amd64 (3.11.4-1+jammy1) ...
正在设置 libpython3.11-dev:amd64 (3.11.4-1+jammy1) ...
正在处理用于 man-db (2.10.2-1) 的触发器 ...
$ pip install mysqlclient
Defaulting to user installation because normal site-packages is not writeable
Collecting mysqlclient
  Using cached mysqlclient-2.2.0.tar.gz (89 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Installing backend dependencies ... done
  Preparing metadata (pyproject.toml) ... done
Building wheels for collected packages: mysqlclient
  Building wheel for mysqlclient (pyproject.toml) ... done
  Created wheel for mysqlclient: filename=mysqlclient-2.2.0-cp311-cp311-linux_x86_64.whl size=125939 sha256=39ad4b956ea2f3e9b93b48835cb7be9df88063c2a8439eb99af6810a18ceab89
  Stored in directory: /home/jarry/.cache/pip/wheels/a4/97/41/1e55ebbb29ce69d9008782f457658f48755b861fa145538ca0
Successfully built mysqlclient
Installing collected packages: mysqlclient
Successfully installed mysqlclient-2.2.0

还是版本问题,还是版本问题,还是版本问题!

重要的事情要说3遍,Linux环境,有很多依赖问题都来自于版本问题,这也是常态,玩开源,一定会遇到这些的,所以通过这个过程,想给各位初学者(包括Linux的和Python的等等)分享一点心得,就是开源的软件环境,我们在学习和使用过程中,一定要保持好下面几条良好的习惯:

1、遇到问题,首先自己先理解一些问题产生的原因,尽量自己解决;

        Linux给我们带来了开源免费的便利,也带来了众多爱好者一同开发使用的诟病,就是版本问题控制的太灵活,大概这也是Linux至今也没有被主流应用的原因吧,除非像华为这样的大厂决心做个封装好的平台来解决这种问题,不然,我们永远会遇到这类问题,但是,不要慌,Linux同时给我们带来了非常方便(远超Windows系统的)控制台反馈机制,这里面很多东西写的很清楚,不要因为都是英文就懒得去读,首先这里面的英文很简单,其次,英文是我们技术人员一段时间内都没办法越过去的(别跟我说什么中文编程语言这类的话),这东西本身就是用英文开发的,并且,专业词汇没有多少,要去掌握!

2、Linux系统最多遇到的问题,就是依赖和版本,多思考;

        资料很多,去互联网上查可能会把头看晕,尤其是可爱的度娘搜索的精度,不敢恭维,直接把错误信息复制粘贴很可能查到的都是近似结果,所以,先思考,根据你自己读到的信息思考,那我遇到的这个例子,你如果直接搜索Getting requirements to build wheel did not run successfully会搜出来很多类似结果,有安装AAAA出现的,有安装BBBB出现的,有安装CCCC出现的,可能忙活半天都没有你想要的结果,所以,我是考虑我的环境中,有可能出现谁的依赖有问题,然后去搜索它们的依赖包都有什么,这样解决问题,快速精准!

3、学会提问,自己实在解决不掉的,到专业的交流平台准确的提问;

        如果自己实在解决不掉,那就学会怎么提问,提问时候最好先描述自己的环境(系统名称、系统版本、软件名称、软件版本、工具名称、工具版本等等),然后提出遇到的问题,附带上自己环境反馈的错误信息,并且描述自己想达到的目的,这四个要素是否齐全以及准确,对于你得到帮助的速度和准确程度都有很大影响,学会提问,不要一两句话放在那里等人给你解决,这里没有商业客服人员为你服务!

希望我这些心得会帮助到爱折腾,能捣鼓的初学者一些,那我也欣慰了!

  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JarryLms

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值