Python3 安装后问题(yum/https)

文章讲述了在安装Python3后,yum命令出现SyntaxError报错,原因是yum默认依赖python2.x。解决方案是将yum命令文件的第一行修改为指向python2.7。另外,Python3访问HTTPS连接报错是由于openssl版本不匹配,需要下载并安装合适版本的openssl,然后卸载并重新安装Python3,确保其与openssl正确配置。

Python3 安装后yum命令报错

问题:

“File "/usr/bin/yum", line 30
 
    except KeyboardInterrupt, e:
 
                            ^
 
SyntaxError: invalid syntax”

分析:

原 python命令软连接指向linux默认安装的python2.x版本、
安装python3时将原python命令的软连接指向了python3 、

yum命令正常情况下调用python2.x 版本、所以需要修改yum命令文件

解决方案:

修改yum命令文件

vi  /usr/bin/yum

第一行

#!/usr/bin/python
修改为
#!/usr/bin/python2.7


Python3 访问https连接报错

问题:

Can\'t connect to HTTPS URL because the SSL module is not available

分析:

openssl 版本不合适
yum源中的openssl版本过低
应下载新版本openssl安装
卸载python3重新安装

解决方案:

下载合适的openssl版本
可去官网寻找新版本安装文件https://www.openssl.org/source/
此处选择openssl-1.1.1t版本 与python3.10.9适配

openssl1.1.1t安装包
python3.10.9 安装包

下载openssl

wget https://www.openssl.org/source/openssl-1.1.1t.tar.gz --no-check-certificate 

解压安装openssl

tar -zxf openssl-1.1.1t.tar.gz 
cd openssl-1.1.1t
./Configure --prefix=/usr/local/openssl #设置安装目录 
make -j && make install  #编译并安装

重新安装 python3
注意此时需将python3卸载干净

切换到 python3 解压包目录
已经编译过的可以先 make clean 清理一下

./configure --prefix=/usr/local/python3 --with-openssl=/usr/local/openssl --with-openssl-rpath=auto 
make -j && make install

安装Python3 步骤可以参考此文章

Linux 安装 Python3

python3一定要卸载干净

可以参考命令

whereis python
which python
Traceback (most recent call last): File "/usr/share/PackageKit/helpers/yum/yumBackend.py", line 2666, in get_updates ygl = self.yumbase.doPackageLists(pkgnarrow=&#39;updates&#39;) File "/usr/lib/python2.7/site-packages/yum/__init__.py", line 3018, in doPackageLists for (n,a,e,v,r) in self.up.getUpdatesList(): File "/usr/lib/python2.7/site-packages/yum/__init__.py", line 1094, in <lambda> up = property(fget=lambda self: self._getUpdates(), File "/usr/lib/python2.7/site-packages/yum/__init__.py", line 838, in _getUpdates self._up = rpmUtils.updates.Updates(self.rpmdb.simplePkgList(), self.pkgSack.simplePkgList()) File "/usr/lib/python2.7/site-packages/yum/__init__.py", line 1075, in <lambda> pkgSack = property(fget=lambda self: self._getSacks(), File "/usr/lib/python2.7/site-packages/yum/__init__.py", line 778, in _getSacks self.repos.populateSack(which=repos) File "/usr/lib/python2.7/site-packages/yum/repos.py", line 347, in populateSack self.doSetup() File "/usr/lib/python2.7/site-packages/yum/repos.py", line 122, in doSetup self.ayum.plugins.run(&#39;prereposetup&#39;) File "/usr/lib/python2.7/site-packages/yum/plugins.py", line 188, in run func(conduitcls(self, self.base, conf, **kwargs)) File "/usr/lib/yum-plugins/fastestmirror.py", line 197, in prereposetup_hook if downgrade_ftp and _len_non_ftp(repo.urls) == 1: File "/usr/lib/python2.7/site-packages/yum/yumRepo.py", line 881, in <lambda> urls = property(fget=lambda self: self._geturls(), File "/usr/lib/python2.7/site-packages/yum/yumRepo.py", line 878, in _geturls self._baseurlSetup() File "/usr/lib/python2.7/site-packages/yum/yumRepo.py", line 827, in _baseurlSetup mirrorurls.extend(self._getMirrorList()) File "/usr/lib/python2.7/site-packages/yum/yumRepo.py", line 2006, in _getMirrorList print "Could not retrieve mirrorlist $s error was\n$s: $s" $ (url, e.args[0], misc.to_unicode(e.args[1])) UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in position 173-177: ordinal not in range(128)
最新发布
09-09
<think> 我们正在解决Linux下PackageKit的yumBackend.py脚本运行时出现的UnicodeEncodeError错误。错误信息为:&#39;ascii&#39; codec can&#39;t encode characters in position 173 - 177: ordinal not in range(128)。这通常是因为在需要输出非ASCII字符(如中文、日文、特殊符号等)时,环境中的默认编码设置不正确,而Python默认使用ASCII编码导致。 解决方法思路: 1. 设置正确的系统环境变量,指定合适的编码(通常是UTF-8)。 2. 在Python脚本中显式设置编码。 具体步骤可能包括: a) 检查并设置终端环境的语言和编码设置(如LANG, LC_ALL等)。 b)Python脚本中,重定向标准输出和标准错误流时指定编码。 c) 修改yumBackend.py脚本,在输出前进行编码处理。 注意:PackageKit的yumBackend.py脚本位于/usr/share/PackageKit/helpers/yum/目录下(根据发行版可能略有不同)。 我们参考了类似问题的解决方案,例如在Python脚本中强制使用UTF-8编码。 具体操作: 方法1:通过环境变量设置 在运行PackageKit之前,设置环境变量: export PYTHONIOENCODING=utf-8 export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8 或者,如果系统支持中文,可以设置为: export LANG=zh_CN.UTF-8 export LC_ALL=zh_CN.UTF-8 方法2:修改yumBackend.py脚本 打开yumBackend.py,在文件开头(通常在import之后)添加以下代码: import sys import locale sys.stdout = open(sys.stdout.fileno(), mode=&#39;w&#39;, encoding=&#39;utf8&#39;, buffering=1) sys.stderr = open(sys.stderr.fileno(), mode=&#39;w&#39;, encoding=&#39;utf8&#39;, buffering=1) 或者,更简单的方法: reload(sys) sys.setdefaultencoding(&#39;utf8&#39;) 但注意:在Python3中,`sys.setdefaultencoding`已被移除,而PackageKit的yumBackend.py可能是Python2脚本(因为yumPython2的)。因此,如果使用Python2,可以尝试使用第二种简单方法;如果使用Python3,则不能使用。 然而,在Python3中,默认编码已经是UTF-8,所以出现这个错误可能是由于环境变量未正确设置。因此,优先检查环境变量。 另外,还有一种方法是修改脚本中打印输出的地方,显式地进行编码,但这样改动较大。 根据错误发生的位置,我们还可以在出错的具体代码行附近进行修改。但如果没有具体行号,我们可以尝试上述全局方法。 由于PackageKit是以服务形式运行,可能需要修改其启动环境。例如,在systemd服务中设置环境变量。 步骤(针对系统服务): 1. 找到PackageKit的服务配置文件,通常在`/usr/lib/systemd/system/packagekit.service`。 2. 在[Service]部分添加环境变量设置,例如: Environment="LANG=en_US.UTF-8" Environment="LC_ALL=en_US.UTF-8" Environment="PYTHONIOENCODING=utf-8" 3. 重新加载systemd配置并重启服务: sudo systemctl daemon-reload sudo systemctl restart packagekit.service 注意:如果服务配置文件被覆盖,可以考虑在`/etc/systemd/system/packagekit.service.d/`下创建override.conf文件来设置环境。 如果上述方法无效,可能需要检查具体哪个字符串输出时出错。可以通过捕获异常来定位,但需要修改脚本。 考虑到PackageKit的yumBackend.py脚本是由PackageKit调用的,我们也可以尝试修改PackageKit的配置文件,但通常环境变量设置是较为通用的方法。 总结:优先尝试设置系统的环境变量(LANG和LC_ALL),然后设置PYTHONIOENCODING。如果问题仍然存在,则考虑修改yumBackend.py脚本或PackageKit服务配置。 注意:修改系统服务配置需要root权限。 下面给出两种方法的详细步骤: 方法一:临时设置环境变量(用于测试) 在终端中执行: export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8 export PYTHONIOENCODING=utf-8 然后重新运行PackageKit(或者触发错误发生的操作),看是否解决。 方法二:永久设置环境变量 将上述环境变量设置添加到用户配置文件(如~/.bashrc)或系统配置文件(如/etc/environment)中。 方法三:修改PackageKit服务配置(如果错误发生在服务启动时) 1. 创建或修改服务配置文件: sudo mkdir -p /etc/systemd/system/packagekit.service.d sudo nano /etc/systemd/system/packagekit.service.d/override.conf 2. 在override.conf文件中输入: [Service] Environment="LANG=en_US.UTF-8" Environment="LC_ALL=en_US.UTF-8" Environment="PYTHONIOENCODING=utf-8" 3. 保存并退出,然后执行: sudo systemctl daemon-reload sudo systemctl restart packagekit 方法四:修改yumBackend.py脚本(如果上述方法无效) 1. 找到yumBackend.py(通常在/usr/share/PackageKit/helpers/yum/yumBackend.py) 2. 在文件开头(在import语句之后)添加: import sys reload(sys) # 仅Python2 sys.setdefaultencoding(&#39;utf8&#39;) 或者(适用于Python2和3): import sys import codecs sys.stdout = codecs.getwriter(&#39;utf8&#39;)(sys.stdout) sys.stderr = codecs.getwriter(&#39;utf8&#39;)(sys.stderr) 但是,在Python3中,codecs.getwriter的方式可能不适用,因为标准输出流已经是文本流。在Python3中,更推荐使用: sys.stdout = open(sys.stdout.fileno(), mode=&#39;w&#39;, encoding=&#39;utf8&#39;, buffering=1) sys.stderr = open(sys.stderr.fileno(), mode=&#39;w&#39;, encoding=&#39;utf8&#39;, buffering=1) 但是,注意在Python3中,如果已经使用了环境变量设置,通常不需要这样修改。 由于不同发行版的PackageKit可能使用Python2或Python3,请根据实际情况选择。 最后,如果问题仍未解决,可能需要检查系统是否缺少相应的语言包。可以通过安装语言包来解决: sudo dnf install glibc-langpack-en # 对于Fedora/RHEL/CentOS 8+ # 或者安装中文包:sudo dnf install glibc-langpack-zh 注意:在CentOS 7中,可能是: yum install glibc-common 然后重新生成语言环境: sudo locale-gen 或者,如果是Debian/Ubuntu: sudo apt-get install language-pack-en sudo locale-gen 总结:这个错误是由于非ASCII字符输出时编码问题引起的。解决方法包括设置环境变量、修改脚本、安装语言包。 注意:修改系统配置前建议备份。 请根据具体发行版和系统环境选择合适的方法。 </think> ### 解决 Linux 下 PackageKit 的 yumBackend.py UnicodeEncodeError 错误 该错误是由于 Python 脚本尝试输出非 ASCII 字符(如中文、特殊符号等)时,系统默认编码设置为 ASCII 导致。以下是完整解决方案: #### 1. **设置系统环境变量**(推荐优先尝试) ```bash # 临时生效(当前会话) export LC_ALL="en_US.UTF-8" export PYTHONIOENCODING=utf-8 # 永久生效(添加到 ~/.bashrc 或 /etc/profile) echo &#39;export LC_ALL="en_US.UTF-8"&#39; | sudo tee -a /etc/environment echo &#39;export PYTHONIOENCODING=utf-8&#39; | sudo tee -a /etc/environment source /etc/environment ``` #### 2. **修改 PackageKit 服务配置** ```bash # 创建配置文件覆盖 sudo mkdir -p /etc/systemd/system/packagekit.service.d sudo nano /etc/systemd/system/packagekit.service.d/override.conf ``` 添加内容: ```ini [Service] Environment="LC_ALL=en_US.UTF-8" Environment="PYTHONIOENCODING=utf-8" ``` 重启服务: ```bash sudo systemctl daemon-reload sudo systemctl restart packagekit ``` #### 3. **修改 yumBackend.py 脚本**(路径通常为 `/usr/share/PackageKit/helpers/yum/yumBackend.py`) 在文件**开头**添加编码声明: ```python import sys import locale # 设置 UTF-8 输出环境 sys.stdout = open(sys.stdout.fileno(), mode=&#39;w&#39;, encoding=&#39;utf-8&#39;, buffering=1) sys.stderr = open(sys.stderr.fileno(), mode=&#39;w&#39;, encoding=&#39;utf-8&#39;, buffering=1) locale.setlocale(locale.LC_ALL, &#39;en_US.UTF-8&#39;) ``` #### 4. **检查系统语言包支持** ```bash # 安装基础语言包(CentOS/RHEL) sudo yum install -y glibc-langpack-en # 生成 UTF-8 语言环境 sudo localedef -c -i en_US -f UTF-8 en_US.UTF-8 ``` #### 5. **验证修复** ```bash # 手动测试脚本输出 python3 -c &#39;print("测试中文輸出")&#39; # 应正常显示中文 ``` > **根本原因**:当 Python 在输出包含非 ASCII 字符(如软件包中的中文描述)时,若系统$LC_*$环境变量未正确配置为 UTF-8,会触发 ASCII 编解码器异常[^1]。 --- ### 相关问题 1. 如何永久修改 Linux 系统的默认语言环境? 2. Python 脚本处理 Unicode 字符有哪些最佳实践? 3. 除 `yumBackend.py` 外,PackageKit 的其他组件(如 `dnfBackend`)出现类似编码错误应如何解决? [^1]: 参考 Python 官方文档 [Unicode HOWTO](https://docs.python.org/3/howto/unicode.html)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

为什么不问问神奇的海螺呢丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值