解决 Python3 报错:AttributeError module ‘upyun’ has no attribute ‘UpYun’

操作背景

操作系统:Windows 7 中文家庭版 64 位

Python 版本:Python 3.6.8rc1

报错详情

我使用又拍云 API 和 Python 写了一个程序,该程序需要用到又拍云的 Python 模块 upyun. 但是,今天我将该程序复制到另一个文件夹下后,再运行却报错:

AttributeError: module 'upyun' has no attribute 'UpYun'
继续阅读“解决 Python3 报错:AttributeError module ‘upyun’ has no attribute ‘UpYun’”

微软今日起停止为 Windows 7 提供支持:一个时代的落幕

据微软官网消息[1],微软对 Windows 7 的支持于 2020 年 01 月 14 日正式终止。根据以往的经验,除非将来 Windows 7 被发现存在特别严重的漏洞并影响了一定数量的用户,否则微软不会再向 Windows 7 用户提供安全更新。而微软对 Windows 7 的主流更新已于 2015 年 01 月 14 日停止,主流更新的停止意味着微软不会再为 Windows 7 系统引入新的功能特性。

继续阅读“微软今日起停止为 Windows 7 提供支持:一个时代的落幕”

手动覆盖更新 WordPress 程序和插件

操作背景

最近从国内访问 wordpress.org 会提示 “429 Too Many Requests”, 而且,由于 WordPress 程序和插件更新时默认都是从 wordpress.org 下载文件,所以更新 WordPress 程序和插件时也是提示 “Too Many Requests”, 无法完成更新。但是,为了站点的安全,必须保持程序版本是较新的,因此只能手动更新。

以下是具体操作过程。

准备工作

在 WordPress 中文官网下载所需版本的 WordPress 程序和 WordPress 插件:

https://cn.wordpress.org

通过 FTP 或者 Wget 将上述文件上传到服务器。

手动更新 WordPress 程序

解压 wordpress 程序压缩包。

首先,删除该压缩包中的 wp-content 文件夹及文件,因为该文件夹中保存的是我们上传的媒体文件,安装的插件等,是 WordPress 程序本身不包含的数据,不能被覆盖:

rm -rf wp-content/

将当前站点目录中的 wp-content 文件夹及文件复制一份做备份:

cp -p -R wp-content/ /var/www/html/bak/

开始覆盖:

注:使用下面的命令执行覆盖操作过程中可能会产生大量询问是否确认覆盖的提示信息,解决方案在这里

cp -R -f wordpress/* /var/www/html/wordpress/

覆盖操作完成后,再次登陆 WordPress 会提示“需要升级数据库”:

图 1

点击“升级WordPress数据库”按钮即可完成数据库的升级:

图 2

点击“继续”按钮即可回到 WordPress 管理后台,至此,对 WordPress 程序的手动覆盖升级已完成。

手动更新 WordPress 插件

WordPress 的插件都安装在 wp-content/plugins 目录下。

首先,在 WordPress 的管理后台中停用需要更新的插件,并删除该插件。

之后,将下载的插件程序解压并移动到 wp-content/plugins 目录下。最后,在管理后台中启用该插件即可。

也可以将从 WordPress.org 下载下来的插件压缩包 (一般是 .zip 格式) 放到 WordPress 的插件目录 wp-content/plugins 下,然后使用如下命令解压即可自动覆盖同路径下的同名文件,达到更新插件的目的:

unzip -o plugins.zip

上述命令中 -o 参数的作用是 “overwrite files WITHOUT prompting”, 即“覆盖文件而不提醒”。

备注

手动更新操作具有一定的风险性,更新之前请务必确保已完成数据库备份,网站文件备份,硬盘镜像备份等保障措施,确保一旦有关操作执行效果未达到预期可以在较短时间内回滚数据,恢复到执行更新操作之前的状态。

EOF

使用 cp 命令覆盖文件时不显示提示信息的方法

操作环境

CentOS 7

问题分析

在使用 cp 命令覆盖文件时,即使加了 -f 参数系统仍然会询问是否覆盖,例如:

cp -R -f 1/* 2/
cp: overwrite ‘2/1.txt’?

使用 alias 命令查看别名发现存在如下别名:

alias cp='cp -i'

这就意味着即使我们输入的是 cp, 但执行时仍然执行的是 cp -i.

使用 cp --help 查看 cp 命令的帮助文档:

-f, --force if an existing destination file cannot be
 opened, remove it and try again (this option
 is ignored when the -n option is also used)
-i, --interactive prompt before overwrite (overrides a previous -n
 option)

从帮助文档可以看到,-i 参数会使系统对每一次覆盖操作都向用户发出提示信息。

解决方案

输入 vi ~/.bashrc 编辑 .bashrc 文件,将其中的 alias cp='cp -i'# 注释掉。

最后,退出当前登陆系统的账户,重新登陆即可。

备注

alias cp='cp -i' 这个别名是一项很重要的安全措施,或许可以在关键时刻阻止我们的误操作,因此,平时还是保留这个别名为好。

EOF

解决 CentOS 7 报错: “Repository base is listed more than once in the configuration”和”没有可用软件包 XXX”的问题

报错描述

我的 CentOS 7 的更新源使用的是直接从 163 镜像站上下载的更新源文件.

今天在使用 yum makecache 命令从更新服务器上把软件包的信息下载到本地缓存起来时遇到了如下报错:

Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration

报错截图如下:

图 1
图 1

而且在我使用 yum install htop 命令安装 htop 的时候, 还提示:

没有可用软件包 htop。
错误:无须任何处理

但是, 正常情况下 CentOS 7 的源里面应该是有 htop 这个软件包的, 可以直接使用 yum install htop 成功安装(我之前安装过).

上述问题的相关截图如下:

图 2

解决方案

分析上面的报错, 主要还是软件源文件出了问题, 于是我们先进入软件源配置文件所在的目录下:

cd /etc/yum.repos.d/

ls 查看一下, 回显如下:

[root@localhost yum.repos.d]# ls
CentOS7-Base-163.repo    CentOS-CR.repo         CentOS-Media.repo
CentOS-Base.repo         CentOS-Debuginfo.repo  CentOS-Sources.repo
CentOS-Base.repo.backup  CentOS-fasttrack.repo  CentOS-Vault.repo
[root@localhost yum.repos.d]#

从对报错内容的分析来看, 应该是软件源有重复(“listed more than once”), 所以这里我们尝试删除一些上面的软件源配置文件.
在删除之前, 先对 /etc/yum.repos.d/ 目录下的文件做一个整体的备份, 以便于尝试失败后的还原, 操作过程如下:
/etc/yum.repos.d/ 目录下的文件整体压缩成一个 .zip 文件:

zip centos7-repo.zip /etc/yum.repos.d/*

然后执行删除操作:

rm -rf CentOS-CR.repo CentOS-Debuginfo.repo CentOS-fasttrack.repo CentOS-Media.repo CentOS-Sources.repo CentOS-Vault.repo

之后把 CentOS7-Base-163.repo 中的内容复制进 CentOS-Base.repo:

cp -p CentOS7-Base-163.repo CentOS-Base.repo

最后删除 CentOS7-Base-163.repo:

rm -rf CentOS7-Base-163.repo

之后运行如下命令重建缓存, 没有再出现”Repository base is listed more than once in the configuration”的报错:

yum clean all
yum makecache

但是, 在我尝试使用 yum 命令安装软件时, 仍然遇到了”没有可用软件包 XXX”的报错, 如下:

[root@localhost yum.repos.d]# yum install htop
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
没有可用软件包 htop。
错误:无须任何处理

“没有可用软件包”说明在 YUM 源中没有对应的软件包(163 的源本身应该是没有问题的, 这是一个大家都常使用的 Linux 方面的国内软件源).
其实, 在 CentOS 和 RHEL 等操作系统中, 常使用的软件源不仅有 YUM, 还有 EPEL. EPEL 英文全称为:”Extra Packages for Enterprise Linux”. 直译为中文就是”用于企业 Linux 的额外软件包”. EPEL 是 Fedora 的一个项目, 有关该项目的官方说明可以在下面的链接中找到:

EPEL – Fedora Project Wiki

这里我摘录一段 Fedora 对 EPEL 项目的说明:

企业版 Linux 附加软件包(以下简称 EPEL)是一个 Fedora 特别兴趣小组,用以创建、维护以及管理针对企业版 Linux 的一个高质量附加软件包集,面向的对象包括但不限于 红帽企业版 Linux (RHEL)、 CentOS、Scientific Linux (SL)、Oracle Linux (OL) 。

EPEL 的软件包通常不会与企业版 Linux 官方源中的软件包发生冲突,或者互相替换文件。EPEL 项目与 Fedora 基本一致,包含完整的构建系统、升级管理器、镜像管理器等等。

https://fedoraproject.org/wiki/EPEL/zh-cn

在 CentOS 7 中安装 EPEL 源的命令如下:

yum install -y epel-release

安装完成后, 在 /etc/yum.repos.d 目录下会多出来下面两个文件, 这两个文件就是 EPEL 源的配置文件:

  • epel.repo
  • epel-testing.repo

查看 epel.repo 文件中的内容可以发现其中软件源的地址指向的是 https://mirrors.fedoraproject.org/, epel-testing.repo 这个文件中的软件源的地址也是指向的是 https://mirrors.fedoraproject.org/. 为了加快软件安装速度, 我们可以将其更改为国内的 EPEL 源, 操作步骤如下:

进入 /etc/yum.repos.d 目录, 下载阿里云 EPEL 源:

wget http://mirrors.aliyun.com/repo/epel-7.repo

备份 Fedora 官方提供的 EPEL 源配置文件:

cp -p epel.repo epel.repo.bak
cp -p epel-testing.repo epel-testing.repo.bak

删除 epel-testing.repo:

rm -rf epel-testing.repo

epel-7.repo 中的内容覆盖写入到原来的 epel.repo 文件中:

cp -p epel-7.repo epel.repo

删除 epel-7.repo 文件:

rm -rf epel-7.repo

重新生成缓存:

yum clean all
yum makecache

之后可以正常安装软件.

总结

遇到”Repository base is listed more than once in the configuration”的问题要考虑系统中是否存在重复的软件源, 遇到”没有可用软件包 XXX”的问题首先要确认要安装的软件包名称是否写对了, 例如安装 pip 的命令不是 yum install pip, 而是 yum install python-pip, 在此之后如果问题仍然存在就需要考虑当前系统中是否正确配置了 YUM 和 EPEL 两个软件源.

CentOS-7修改主机名

方法一(修改静态主机名):

vi /etc/hostname

注:由于静态主机名是系统初始化时从/etc/hostname中读取的,所以修改其中的内容为自己想要的主机名即可实现对静态主机名的修改。

之后reboot以生效。

方法二(修改瞬态主机名):

hostname aaa

注:aaa为新主机名。

查看主机名:

hostname

上述命令查看主机名发现显示的主机名是aaa ,但是命令行提示符前面的主机名并没有改变。此时如果是在纯文本界面,使用Alt+Fn+F3 或Alt+F3 组合键即可以新的主机名(aaa)进行登陆,如果在图形化界面中,直接打开一个新的模拟终端就可以看到新的主机名(aaa)了。

注:reboot后,该方法所做的修改失效。

方法三(使用hostnamectl修改主机名):

hostnamectl是CentOS-7中新增的一个用于修改主机名的指令。在CentOS中有“static静态”、“transient瞬态”和“pretty灵活”三种主机名命名方式(在static和transient形式的主机名中不允许出现特殊字符和空格,而在pretty形式的主机名中则没有这些限制,pretty形式的主机名只是用于展示给终端用户。),使用hostnamectl可以很方便的修改这三种状态的主机名。

同时修改static, transient, pretty三种形式的主机名:

hostnamectl set-hostname aaa

仅修改静态形式主机名:

hostnamectl --static set-hostname aaa

仅修改瞬态形式主机名:

hostnamectl --transient set-hostname aaa

仅修改灵活形式主机名:

hostnamectl --pretty set-hostname aaa

注:使用方法三修改后需reboot以生效。