大家好,我是水滴~~
本文将介绍了使用的知识点、以及将OSS文件下载到ECS中的代码、并对该代码进行详细解析、最后给出部署方案,希望能对你有所帮助!
《Python入门核心技术》专栏总目录・点这里
在上一篇文章中,我们将需要下载的OSS文件,全部列举并存入MySQL数据库中。这篇文章是我们继续讲解第二步:将OSS文件下载到ECS中,并修改文件记录的状态。
datetime模块是Python标准库中用于处理日期和时间的模块。它提供了多个类来处理日期、时间、时间间隔等,并且支持日期时间的运算和格式化。
更多介绍参见:《日期和时间(time、datetime、calendar 模块》
os 是 Python 标准库中的一个模块,提供了与操作系统交互的功能。通过 os 模块,您可以执行各种与文件系统、进程管理、环境变量等相关的操作。
更多介绍参见:《os 模块》
mysql-connector-python 是 MySQL 官方提供的 Python 连接器,用于在 Python 应用程序中与 MySQL 数据库进行交互。它是一个纯 Python 实现的驱动程序,可以通过它执行 SQL 查询、插入、更新、删除等操作。
在使用前需要先安装该库,下面是安装命令:
pip install mysql-connector-python
PyInstaller 是一个用于将 Python 应用程序打包成独立可执行文件的工具。它可以将 Python 代码及其依赖项(包括解释器)打包成单个可执行文件,这样用户可以在没有安装 Python 解释器或依赖项的情况下运行你的应用程序。你可以使用 PyInstaller 来创建跨平台的可执行文件,支持 Windows、macOS 和 Linux 等操作系统。
在使用前需要先安装该库,下面是安装命令:
pip install pyinstaller
下面代码使用了 oss2
和 mysql-connector-python
两个第三方库,所以要提前安装它们,下面是安装指令:
pip install oss2
pip install mysql-connector-python
在项目中创建一个第二步:将OSS文件下载到ECS中.py
Python文件,下面是完整代码:
import os
import time
from datetime import datetime
import mysql.connector
import oss2
# 创建并获取 OSS 存储桶对象
def get_bucket():
# OSS认证,需要 access_key_id 和 access_key_secret
auth = oss2.Auth('填写你的access_key_id', '填写你的access_key_secret')
# OSS 端点地址(如果该程序部署到 ECS 上,这里使用内网地址可以节约一些流量)
endpoint = '填写你的端点,例如:https://oss-cn-qingdao.aliyuncs.com'
# 存储桶名称
bucket_name = '填写你的bucket_name'
# 创建一个存储桶对象
return oss2.Bucket(auth, endpoint, bucket_name)
# 检测磁盘空间是否充裕
def check_disk_space():
# 获取当前目录的路径
current_directory = os.getcwd()
# 获取当前目录的磁盘空间信息
disk_usage = os.statvfs(current_directory)
# 计算当前目录的可用空间
available_space = disk_usage.f_frsize * disk_usage.f_bavail
# 将空间大小转换为GB
available_space_gb = available_space / (1024 ** 3)
print("当前目录的可用空间:" + str(available_space_gb) + "GB")
if available_space_gb > 50:
return True
else:
return False
# 创建文件的目录
def makedirs(filename):
# 获取文件的目录
directory = os.path.dirname(filename)
# 检查目录是否存在,如果不存在则创建目录
if not os.path.exists(directory):
os.makedirs(directory)
# 文件ECS存储路径
file_path = "/data/app/oss_download/file_list/"
if __name__ == '__main__':
# 建立与数据库的连接
cnx = mysql.connector.connect(user='root', password='root', host='localhost', database='oss', port=3306)
# 创建一个游标对象
cursor = cnx.cursor()
# 获取 OSS 存储桶对象
bucket = get_bucket()
try:
while True:
try:
# 查询前10个待处理数据,执行查询
cursor.execute('select id, key from oss_file where status = 0 order by last_modified limit 10')
# 获取查询结果,结果为元组类型
results = cursor.fetchall()
# 查询结果为空,退出循环
if len(results) == 0:
print("-------全部处理完了")
break
# 遍历查询结果,逐个下载
for row in results:
# 打印该文件
data = {
'id': row[0],
'key': row[1]
}
key = data['key']
print(key)
# 创建目录
file_name = file_path + key
makedirs(file_name)
# 下载到本地
bucket.get_object_to_file(key, file_name)
# 修改数据状态,status设为1
data['update_time'] = datetime.now()
cursor.execute('update oss_file set status = 1, update_time = %(update_time)s where id = %(id)s',
data)
# 提交更改到数据库
cnx.commit()
# 删除OSS文件
bucket.delete_object(key)
# 修改数据状态,status设为2
data['update_time'] = datetime.now()
cursor.execute('update oss_file set status = 2, update_time = %(update_time)s where id = %(id)s',
data)
# 提交更改到数据库
cnx.commit()
# 下载一轮后,检测一下磁盘空间
while True:
if check_disk_space():
break
else:
# 休眠10分钟
time.sleep(600)
except Exception as e:
print(str(e))
# 休眠1秒
time.sleep(1)
continue
finally:
# 关闭游标和数据库连接
cursor.close()
cnx.close()
get_bucket
方法用于创建并获取OSS的存储桶对象,我这里使用简单的Auth
凭证,官方推荐使用安全的ProviderAuth
凭证,参见:Python配置访问凭证。
check_disk_space
方法用于检测磁盘剩余空间是否充裕,该方法会输出磁盘大小。为了学习多样性,这里检测磁盘的方式是Linux版本,后面下载到本地改用Windows版本,你可以根据实际情况来选择。
makedirs
方法用于检测ECS上是否存在所需目录,如果不存在,则创建目录。
在main
主方法中,首先创建了一个 MySQL 的连接,用于将列举出的文件名写入库中;接着获取OSS的存储桶对象。
接着创建一个死循环,用于不断的下载文件,直到下载完为止。
循环中,首先从数据库中查询前10个待处理的文件列表(status
为0,并按last_modified
排序),表示先处理最旧的数据(如果返回的列表为空,表示所有文件已经处理完,退出即可)。
遍历这个文件列表,逐个从OSS中下载到ECS中,使用bucket.get_object_to_file()
方法下载,参见:Python下载到本地文件。下载完后,将该记录的状态改为1。
然后再将该文件从OSS中删除,使用bucket.delete_object()
方法删除,参见:Python删除文件。删除后,将该记录的状态改为2。
这样处理一轮文件后,检测一下磁盘空间是否充裕,如果充裕就继续处理下一轮,如果不充裕,则休眠10分钟,直到充裕后再执行下一轮。
最后,关闭数据库连接。
requirements.txt
是一个常用的文本文件,用于列出项目所需的所有依赖项及其版本信息。它通常用于 Python 项目,但也可以在其他项目中使用。
在项目中执行下面命令,可以列出依赖项:
pip freeze > requirements.txt
这将输出当前环境中所有安装的包及其版本信息,并将其写入requirements.txt
文件中。
在 Linux 服务器的项目根目录下,可以运行以下命令来安装requirements.txt
中列出的所有依赖项:
pip install -r requirements.txt
这将安装所列出的所有依赖项及其指定的版本。
将 第二步:将OSS文件下载到ECS中.py
Python文件拷贝到 Linux 服务器项目根目录下,执行下面命令即可运行该 Python 文件:
python 第二步:将OSS文件下载到ECS中.py
如果想要后台运行,并且将print
输出到指定的日志文件中,可以使用以下命令:
nohup python 第二步:将OSS文件下载到ECS中.py > output.log 2>&1 &
这个命令执行以下操作:
nohup
命令用于在后台运行进程,即使终端关闭后也能继续运行。
第二步:将OSS文件下载到ECS中.py
是你要运行的Python脚本。
> output.log
将标准输出重定向到名为output.log
的日志文件中。
2>&1
将标准错误也重定向到标准输出,这样错误信息也会被写入到output.log
中。
最后的&
符号用于将进程放到后台运行。
这样,你的Python项目就会在后台运行,并将print输出写入到指定的日志文件中。
如果你想部署在Windows服务器下,一个简单的方式就是通过 PyInstaller 来打包部署。它可以将Python代码及其依赖项(包括解释器)打包成单个可执行文件,这样即使服务器没有安装Python环境也可以运行你的应用程序。
下面命令可以将上面的Python脚本打包成一个exe
的可执行文件:
pyinstaller -F 第二步:将OSS文件下载到ECS中.py