Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Hebat, gunakan Python untuk mengautomasikan penggunaan perkhidmatan!

Hebat, gunakan Python untuk mengautomasikan penggunaan perkhidmatan!

王林
王林ke hadapan
2023-04-14 13:49:032074semak imbas

Hebat, gunakan Python untuk mengautomasikan penggunaan perkhidmatan!

Apabila menggunakan projek bahagian hadapan baru-baru ini, anda perlu memuat naik pakej termampat projek bahagian hadapan ke direktori /tmp pelayan aplikasi melalui mesin benteng, kemudian masukkan pelayan aplikasi dan gunakan arahan mv untuk Pindahkan fail yang dimampatkan ke direktori tetapan projek Nginx, dan akhirnya gunakan arahan unzip untuk menyahmampat fail untuk menyelesaikan penggunaan projek.

Analisis yang teliti menunjukkan bahawa kebanyakan operasi adalah tindakan berulang, dan melengkapkan operasi ini secara manual akan mengurangkan kecekapan kerja dengan ketara.

Artikel ini akan memperkenalkan cara menggunakan Python untuk memantau folder untuk membantu dalam menyelesaikan penggunaan perkhidmatan.

1. Persediaan

Di sini kami akan memperkenalkan "anjing pemerhati" pustaka pergantungan Python

Ia boleh digunakan untuk memantau fail dalam direktori fail tertentu Perubahan fail termasuk operasi seperti pemadaman, pengubahsuaian dan penambahan Setiap operasi akan memanggil semula fungsi acara Kami boleh menulis logik tersuai secara dalaman untuk memenuhi keperluan kami.

# 安装依赖包
pip3 install watchdog

Alamat projek:

https://www.php.cn/link/47841cc9e552bd5c40164db7073b817b​​>
2. Mari kita lakukan dalam amalan


Pertama, kita perlu mencipta pendengar untuk mendengar direktori folder:

Kemudian, cipta 2 objek pemprosesan acara.
from watchdog.observers import Observer
...
# 创建一个监听器,用来监听文件夹目录
observer = Observer()
...


PS: Objek ini diwarisi daripada kelas "FileSystemEventHandler".


Mereka digunakan untuk memantau direktori "/tmp" dan direktori "/home/project/frontend" masing-masing Anggapkan objek acara dinamakan obj1, obj2

<.>obj1 bertanggungjawab Pantau direktori /tmp, tulis semula kaedah acara "Baharu atau Ubah Suai", dan lengkapkan operasi mengalih fail termampat:

obj2 bertanggungjawab untuk memantau /home/project/ direktori frontend, dan juga menulis semula kaedah Acara "Baharu atau Diubah Suai" untuk melengkapkan tindakan penyahmampatan fail termampat:

from watchdog.events import *
import ntpath
import shutil
import zipfile
def get_filename(filepath):
 """
 根据文件夹目录,获取文件名称(待后缀)
 :param filepath:
 :return:
 """
 return ntpath.basename(filepath)
class FileMoveHandler(FileSystemEventHandler):
 def __init__(self):
 FileSystemEventHandler.__init__(self)
 ...
 # 文件新建
 def on_created(self, event):
 # 新建文件夹
 if event.is_directory:
 # print("directory created:{0}".format(event.src_path))
 pass
 # 新建文件
 else:
 # print("file created:{0}".format(event.src_path))
 filename = get_filename(event.src_path)
 # 如果属于前端的4个项目压缩包,开始文件夹的操作
 if filename in watch_tags:
 self.start(filename)
...
def on_modified(self, event):
 if event.is_directory:
 # print("directory modified:{0}".format(event.src_path))
 pass
 else:
 # print("file modified:{0}".format(event.src_path))
 filename = get_filename(event.src_path)
 if filename in watch_tags:
 self.start(filename)
 ...
 def start(self, filename):
 """
 文件处理逻辑
 :param filename:
 :return:
 """
 try:
 # 文件名不带后缀
 filename_without_suffix = filename.split(".")[0]
 # 源文件路径(压缩包文件)
 source_file_path = watch_folder + filename
 # 目标文件路径(压缩包文件)
 target_file_path = target_folder + filename
 # 目标项目文件夹(目标项目)
 target_project_path = target_folder + filename_without_suffix
 # 1、复制文件到目标文件夹
 print(f"拷贝源目录{source_file_path},目标文件夹:{target_folder}")
 # 删除目标文件夹下的压缩文件
 if os.path.exists(target_file_path):
 os.remove(target_file_path)
 # 移动文件到目标文件夹中
 shutil.move(source_file_path, target_folder)
 # 2、清空目标文件夹中内的所有文件夹(如果存在)
 # 如果不存在,新建一个文件夹
 if os.path.exists(target_project_path):
 shutil.rmtree(target_project_path, ignore_errors=True)
 print(f"项目{filename_without_suffix}移动成功!")
 except Exception as e:
 print("部署失败,错误原因:", str(e.args))

Kemudian, mulakan tugas mendengar dua peristiwa di atas melalui pendengar:

...
 def start(self, filename):
 # 文件名不带后缀
 filename_without_suffix = filename.split(".")[0]
 # 目标文件路径(压缩包文件)
 target_file_path = target_folder + filename
 # 目标项目文件夹(目标项目)
 target_project_path = target_folder + filename_without_suffix
 r = zipfile.is_zipfile(target_file_path)
 if r:
 fz = zipfile.ZipFile(target_file_path, 'r')
 for file in fz.namelist():
 fz.extract(file, target_folder)
 else:
 print('这不是一个正常的zip压缩包!')
...

Akhir sekali, kami lulus arahan "nohup" untuk membiarkan program monitor fail berjalan di latar belakang.

import time
...
if __name__ == "__main__":
 # 待监听的文件夹目录
 watch_folder = "/tmp/"
 # 项目目标文件夹目录
 target_folder = "/home/project/frontend/"
 # 监听文件夹名称,即:项目压缩包名称
 watch_tags = ['proj1.zip', 'proj2.zip', 'proj3.zip', 'proj4.zip']
 # 创建一个监听器,用来监听文件夹目录
 observer = Observer()
 # 创建两个事件处理对象
 move_handler = FileMoveHandler()
 unzip_handler = FileUnzipHandler()
 # 启动监控任务
 # 参数分别是:观察者、监听目录、是否监听子目录
 observer.schedule(move_handler, watch_folder, True)
 observer.schedule(unzip_handler, target_folder, True)
 observer.start()
 try:
 while True:
 time.sleep(1)
 except KeyboardInterrupt:
 observer.stop()
 observer.join()
...

3. Ringkasan

# 在后台运行
# 项目文件:watch_folder.py
# 日志文件:watch_folder.log
nohup python3 -u watch_folder.py > watch_folder.log 2>&1 &
# 查看日志:
cat watch_folder.log

Melalui operasi di atas, setiap kali saya memuat naik fail projek termampat zip bahagian hadapan ke direktori /tmp pelayan aplikasi melalui benteng mesin, atur cara akan melaksanakan operasi seterusnya secara automatik dan secara automatik melengkapkan penggunaan aplikasi.

Saya telah memuat naik kod sumber dalam artikel ke bahagian belakang, balas dengan kata kunci " watchdog " untuk mendapatkan kod sumber yang lengkap.

Jika anda rasa artikel itu bagus, sila like dan share, kerana ini akan menjadi motivasi paling kuat untuk saya terus menghasilkan lebih banyak artikel berkualiti tinggi!

Atas ialah kandungan terperinci Hebat, gunakan Python untuk mengautomasikan penggunaan perkhidmatan!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam