Python PaddleNLP实现自动生成虎年藏头诗

目录
  • 一、 数据处理
    • 1.paddlenlp升级
    • 2.提取诗头
    • 3.生成词表
    • 4.定义dataset
  • 二、定义模型并训练
    • 1.模型定义
    • 2.模型训练
    • 3.模型保存
  • 三、生成藏头诗
  • 总结

一、 数据处理

本项目中利用古诗数据集作为训练集,编码器接收古诗的每个字的开头,解码器利用编码器的信息生成所有的诗句。为了诗句之间的连贯性,编码器同时也在诗头之前加上之前诗句的信息。举例:

“白日依山尽,黄河入海流,欲穷千里目,更上一层楼。” 可以生成两个样本:

样本一:编码器输入,“白”;解码器输入,“白日依山尽,黄河入海流”

样本二:编码器输入,“白日依山尽,黄河入海流。欲”;解码器输入,“欲穷千里目,更上一层楼。”

1.paddlenlp升级

!pip install -U paddlenlp
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting paddlenlp
[?25l  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/17/9b/4535ccf0e96c302a3066bd2e4d0f44b6b1a73487c6793024475b48466c32/paddlenlp-2.2.3-py3-none-any.whl (1.2MB)
[K     |████████████████████████████████| 1.2MB 11.2MB/s eta 0:00:01
[?25hRequirement already satisfied, skipping upgrade: h5py in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlenlp) (2.9.0)
Requirement already satisfied, skipping upgrade: colorlog in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlenlp) (4.1.0)
Requirement already satisfied, skipping upgrade: colorama in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlenlp) (0.4.4)
Requirement already satisfied, skipping upgrade: seqeval in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlenlp) (1.2.2)
Requirement already satisfied, skipping upgrade: jieba in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlenlp) (0.42.1)
Requirement already satisfied, skipping upgrade: multiprocess in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlenlp) (0.70.11.1)
Requirement already satisfied, skipping upgrade: six in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from h5py->paddlenlp) (1.16.0)
Requirement already satisfied, skipping upgrade: numpy>=1.7 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from h5py->paddlenlp) (1.20.3)
Requirement already satisfied, skipping upgrade: scikit-learn>=0.21.3 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from seqeval->paddlenlp) (0.24.2)
Requirement already satisfied, skipping upgrade: dill>=0.3.3 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from multiprocess->paddlenlp) (0.3.3)
Requirement already satisfied, skipping upgrade: scipy>=0.19.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from scikit-learn>=0.21.3->seqeval->paddlenlp) (1.6.3)
Requirement already satisfied, skipping upgrade: threadpoolctl>=2.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from scikit-learn>=0.21.3->seqeval->paddlenlp) (2.1.0)
Requirement already satisfied, skipping upgrade: joblib>=0.11 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from scikit-learn>=0.21.3->seqeval->paddlenlp) (0.14.1)
Installing collected packages: paddlenlp
  Found existing installation: paddlenlp 2.1.1
    Uninstalling paddlenlp-2.1.1:
      Successfully uninstalled paddlenlp-2.1.1
Successfully installed paddlenlp-2.2.3

2.提取诗头

import re
poems_file = open("./data/data70759/poems_zh.txt", encoding="utf8")
# 对读取的每一行诗句,统计每一句的词头
poems_samples = []
poems_prefix = []
poems_heads = []
for line in poems_file.readlines():
    line_ = re.sub('。', ' ', line)
    line_ = line_.split()
    # 生成训练样本
    for i, p in enumerate(line_):
        poems_heads.append(p[0])
        poems_prefix.append('。'.join(line_[:i]))
        poems_samples.append(p + '。')

# 输出文件信息
for i in range(20):
    print("poems heads:{}, poems_prefix: {}, poems:{}".format(poems_heads[i], poems_prefix[i], poems_samples[i]))
poems heads:欲, poems_prefix: , poems:欲出未出光辣达,千山万山如火发。
poems heads:须, poems_prefix: 欲出未出光辣达,千山万山如火发, poems:须臾走向天上来,逐却残星赶却月。
poems heads:未, poems_prefix: , poems:未离海底千山黑,才到天中万国明。
poems heads:满, poems_prefix: , poems:满目江山四望幽,白云高卷嶂烟收。
poems heads:日, poems_prefix: 满目江山四望幽,白云高卷嶂烟收, poems:日回禽影穿疏木,风递猿声入小楼。
poems heads:远, poems_prefix: 满目江山四望幽,白云高卷嶂烟收。日回禽影穿疏木,风递猿声入小楼, poems:远岫似屏横碧落,断帆如叶截中流。
poems heads:片, poems_prefix: , poems:片片飞来静又闲,楼头江上复山前。
poems heads:飘, poems_prefix: 片片飞来静又闲,楼头江上复山前, poems:飘零尽日不归去,帖破清光万里天。
poems heads:因, poems_prefix: , poems:因登巨石知来处,勃勃元生绿藓痕。
poems heads:静, poems_prefix: 因登巨石知来处,勃勃元生绿藓痕, poems:静即等闲藏草木,动时顷刻徧乾坤。
poems heads:横, poems_prefix: 因登巨石知来处,勃勃元生绿藓痕。静即等闲藏草木,动时顷刻徧乾坤, poems:横天未必朋元恶,捧日还曾瑞至尊。
poems heads:不, poems_prefix: 因登巨石知来处,勃勃元生绿藓痕。静即等闲藏草木,动时顷刻徧乾坤。横天未必朋元恶,捧日还曾瑞至尊, poems:不独朝朝在巫峡,楚王何事谩劳魂。
poems heads:若, poems_prefix: , poems:若教作镇居中国,争得泥金在泰山。
poems heads:才, poems_prefix: , poems:才闻暖律先偷眼,既待和风始展眉。
poems heads:嚼, poems_prefix: , poems:嚼处春冰敲齿冷,咽时雪液沃心寒。
poems heads:蒙, poems_prefix: , poems:蒙君知重惠琼实,薄起金刀钉玉深。
poems heads:深, poems_prefix: , poems:深妆玉瓦平无垅,乱拂芦花细有声。
poems heads:片, poems_prefix: , poems:片逐银蟾落醉觥。
poems heads:巧, poems_prefix: , poems:巧剪银花乱,轻飞玉叶狂。
poems heads:寒, poems_prefix: , poems:寒艳芳姿色尽明。

3.生成词表

# 用PaddleNLP生成词表文件,由于诗文的句式较短,我们以单个字作为词单元生成词表
from paddlenlp.data import Vocab

vocab = Vocab.build_vocab(poems_samples, unk_token="<unk>", pad_token="<pad>", bos_token="<", eos_token=">")
vocab_size = len(vocab)

print("vocab size", vocab_size)
print("word to idx:", vocab.token_to_idx)

4.定义dataset

# 定义数据读取器
from paddle.io import Dataset, BatchSampler, DataLoader
import numpy as np

class PoemDataset(Dataset):
    def __init__(self, poems_data, poems_heads, poems_prefix, vocab, encoder_max_len=128, decoder_max_len=32):
        super(PoemDataset, self).__init__()
        self.poems_data = poems_data
        self.poems_heads = poems_heads
        self.poems_prefix = poems_prefix
        self.vocab = vocab
        self.tokenizer = lambda x: [vocab.token_to_idx[x_] for x_ in x]
        self.encoder_max_len = encoder_max_len
        self.decoder_max_len = decoder_max_len

    def __getitem__(self, idx):
        eos_id = vocab.token_to_idx[vocab.eos_token]
        bos_id = vocab.token_to_idx[vocab.bos_token]
        pad_id = vocab.token_to_idx[vocab.pad_token]
        # 确保encoder和decoder的输出都小于最大长度
        poet = self.poems_data[idx][:self.decoder_max_len - 2]  # -2 包含bos_id和eos_id
        prefix = self.poems_prefix[idx][- (self.encoder_max_len - 3):]  # -3 包含bos_id, eos_id, 和head的编码
        # 对输入输出编码

        sample = [bos_id] + self.tokenizer(poet) + [eos_id]
        prefix = self.tokenizer(prefix) if prefix else []
        heads = prefix + [bos_id] + self.tokenizer(self.poems_heads[idx]) + [eos_id]
        sample_len = len(sample)
        heads_len = len(heads)
        sample = sample + [pad_id] * (self.decoder_max_len - sample_len)
        heads = heads + [pad_id] * (self.encoder_max_len - heads_len)
        mask = [1] * (sample_len - 1) + [0] * (self.decoder_max_len - sample_len) # -1 to make equal to out[2]
        out = [np.array(d, "int64") for d in [heads, heads_len, sample, sample, mask]]
        out[2] = out[2][:-1]
        out[3] = out[3][1:, np.newaxis]
        return out

    def shape(self):
        return [([None, self.encoder_max_len], 'int64', 'src'),
                ([None, 1], 'int64', 'src_length'),
                ([None, self.decoder_max_len - 1],'int64', 'trg')], \
               [([None, self.decoder_max_len - 1, 1], 'int64', 'label'),
                ([None, self.decoder_max_len - 1], 'int64', 'trg_mask')]

    def __len__(self):
        return len(self.poems_data)

dataset = PoemDataset(poems_samples, poems_heads, poems_prefix, vocab)
batch_sampler = BatchSampler(dataset, batch_size=2048)
data_loader = DataLoader(dataset, batch_sampler=batch_sampler)

二、定义模型并训练

1.模型定义

from Seq2Seq.models import Seq2SeqModel
from paddlenlp.metrics import Perplexity
from Seq2Seq.loss import CrossEntropyCriterion
import paddle
from paddle.static import InputSpec

# 参数
lr = 1e-6
max_epoch = 20
models_save_path = "./checkpoints"

encoder_attrs = {"vocab_size": vocab_size, "embed_dim": 200, "hidden_size": 128, "num_layers": 4, "dropout": .2,
                    "direction": "bidirectional", "mode": "GRU"}
decoder_attrs = {"vocab_size": vocab_size, "embed_dim": 200, "hidden_size": 128, "num_layers": 4, "direction": "forward",
                    "dropout": .2, "mode": "GRU", "use_attention": True}

# inputs shape and label shape
inputs_shape, labels_shape = dataset.shape()
inputs_list = [InputSpec(input_shape[0], input_shape[1], input_shape[2]) for input_shape in inputs_shape]
labels_list = [InputSpec(label_shape[0], label_shape[1], label_shape[2]) for label_shape in labels_shape]

net = Seq2SeqModel(encoder_attrs, decoder_attrs)
model = paddle.Model(net, inputs_list, labels_list)

model.load("./final_models/model")

opt = paddle.optimizer.Adam(learning_rate=lr, parameters=model.parameters())

model.prepare(opt, CrossEntropyCriterion(), Perplexity())
W0122 21:03:30.616776   166 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0122 21:03:30.620450   166 device_context.cc:465] device: 0, cuDNN Version: 7.6.

2.模型训练

# 训练,训练时间较长,已提供了训练好的模型(./final_models/model)
model.fit(train_data=data_loader, epochs=max_epoch, eval_freq=1, save_freq=5, save_dir=models_save_path, shuffle=True)

3.模型保存

# 保存
model.save("./final_models/model")

三、生成藏头诗

import warnings

def post_process_seq(seq, bos_idx, eos_idx, output_bos=False, output_eos=False):
    """
    Post-process the decoded sequence.
    """
    eos_pos = len(seq) - 1
    for i, idx in enumerate(seq):
        if idx == eos_idx:
            eos_pos = i
            break
    seq = [idx for idx in seq[:eos_pos + 1]
           if (output_bos or idx != bos_idx) and (output_eos or idx != eos_idx)]
    return seq

# 定义用于生成祝福语的类
from paddlenlp.data.tokenizer import JiebaTokenizer

class GenPoems():
    # content (str): the str to generate poems, like "恭喜发财"
    # vocab: the instance of paddlenlp.data.vocab.Vocab
    # model: the Inference Model
    def __init__(self, vocab, model):
        self.bos_id = vocab.token_to_idx[vocab.bos_token]
        self.eos_id = vocab.token_to_idx[vocab.eos_token]
        self.pad_id = vocab.token_to_idx[vocab.pad_token]
        self.tokenizer = lambda x: [vocab.token_to_idx[x_] for x_ in x]
        self.model = model
        self.vocab = vocab

    def gen(self, content, max_len=128):
        # max_len is the encoder_max_len in Seq2Seq Model.
        out = []
        vocab_list = list(vocab.token_to_idx.keys())
        for w in content:
            if w in vocab_list:
                content = re.sub("([。,])", '', content)
                heads = out[- (max_len - 3):] + [self.bos_id] + self.tokenizer(w) + [self.eos_id]
                len_heads = len(heads)
                heads = heads + [self.pad_id] * (max_len - len_heads)
                x = paddle.to_tensor([heads], dtype="int64")
                len_x = paddle.to_tensor([len_heads], dtype='int64')
                pred = self.model.predict_batch(inputs = [x, len_x])[0]
                out += self._get_results(pred)[0]
            else:
                warnings.warn("{} is not in vocab list, so it is skipped.".format(w))
                pass
        out = ''.join([self.vocab.idx_to_token[id] for id in out])
        return out

    def _get_results(self, pred):
        pred = pred[:, :, np.newaxis] if len(pred.shape) == 2 else pred
        pred = np.transpose(pred, [0, 2, 1])
        outs = []
        for beam in pred[0]:
            id_list = post_process_seq(beam, self.bos_id, self.eos_id)
            outs.append(id_list)
        return outs
# 载入预测模型
from Seq2Seq.models import Seq2SeqInferModel
import paddle

encoder_attrs = {"vocab_size": vocab_size, "embed_dim": 200, "hidden_size": 128, "num_layers": 4, "dropout": .2,
                    "direction": "bidirectional", "mode": "GRU"}
decoder_attrs = {"vocab_size": vocab_size, "embed_dim": 200, "hidden_size": 128, "num_layers": 4, "direction": "forward",
                    "dropout": .2, "mode": "GRU", "use_attention": True}

infer_model = paddle.Model(Seq2SeqInferModel(encoder_attrs,
                                             decoder_attrs,
                                             bos_id=vocab.token_to_idx[vocab.bos_token],
                                             eos_id=vocab.token_to_idx[vocab.eos_token],
                                             beam_size=10,
                                             max_out_len=256))
infer_model.load("./final_models/model")
# 送新年祝福
# 当然,表白也可以
generator = GenPoems(vocab, infer_model)

content = "生龙活虎"
poet = generator.gen(content)
for line in poet.strip().split('。'):
    try:
        print("{}\t{}。".format(line[0], line))
    except:
        pass

输出结果

生    生涯不可见,何处不相逢。
龙    龙虎不知何处,人间不见人间。
活    活人不是人间事,不觉人间不可识。
虎    虎豹相逢不可寻,不知何处不相识。

总结

这个项目介绍了如何训练一个生成藏头诗的模型,从结果可以看出,模型已经具有一定的生成诗句的能力。但是,限于训练集规模和训练时间,生成的诗句还有很大的改进空间,未来还将进一步优化这个模型,敬请期待。

以上就是Python PaddleNLP实现自动生成虎年藏头诗的详细内容,更多关于PaddleNLP生成藏头诗的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python PaddleGAN实现调整照片人物年龄

    目录 前言 环境部署 项目使用 预处理部分 照片老化处理 照片年轻化处理 总结 前言 最近在试着研究飞浆平台的许多功能,看到了许多有意思的功能.其中可以将照片美化以及年龄调整这个功能让我想到了之前抖音的一个功能,所以特别感兴趣.花了些时间把项目拉下来玩了玩,用了一些我自己找的数据. PaddleGAN的Github地址:github仓库 环境部署 如果没有看过相关的文章,可能会被README搞得很迷糊.先不用看README中一个个教程或者md,我们要先安装执行环境.主要看docs/zh_CN/i

  • Python PaddleGAN实现照片人物性别反转

    前言 接着我的上篇文章:Python PaddleGAN实现调整照片人物年龄 在上面的文章中,我们发现styleganv2editing.py是支持性别编辑的.所以调整了一下参数,来试着实现一下照片的性别翻转.下面我们开始吧 环境搭建 这部分就直接参考上面的文章吧,就不再写一遍了.先发一下我准备的照片,如下: 实现过程 下面我们一步步操作一下,首先我们要做个预处理,和上一篇文章中一样. 预处理 执行命令 python -u applications/tools/pixel2style2pixel

  • Python人工智能深度学习模型训练经验总结

    目录 一.假如训练集表现不好 1.尝试新的激活函数 2.自适应学习率 ①Adagrad ②RMSProp ③ Momentum ④Adam 二.在测试集上效果不好 1.提前停止 2.正则化 3.Dropout 一.假如训练集表现不好 1.尝试新的激活函数 ReLU:Rectified Linear Unit 图像如下图所示:当z<0时,a = 0, 当z>0时,a = z,也就是说这个激活函数是对输入进行线性转换.使用这个激活函数,由于有0的存在,计算之后会删除掉一些神经元,使得神经网络变窄.

  • Python深度学习之Unet 语义分割模型(Keras)

    目录 前言 一.什么是语义分割 二.Unet 1.基本原理 2.mini_unet 3. Mobilenet_unet 4.数据加载部分 参考 前言 最近由于在寻找方向上迷失自我,准备了解更多的计算机视觉任务重的模型.看到语义分割任务重Unet一个有意思的模型,我准备来复现一下它. 一.什么是语义分割 语义分割任务,如下图所示: 简而言之,语义分割任务就是将图片中的不同类别,用不同的颜色标记出来,每一个类别使用一种颜色.常用于医学图像,卫星图像任务. 那如何做到将像素点上色呢? 其实语义分割的输

  • Python-OpenCV深度学习入门示例详解

    目录 0. 前言 1. 计算机视觉中的深度学习简介 1.1 深度学习的特点 1.2 深度学习大爆发 2. 用于图像分类的深度学习简介 3. 用于目标检测的深度学习简介 4. 深度学习框架 keras 介绍与使用 4.1 keras 库简介与安装 4.2 使用 keras 实现线性回归模型 4.3 使用 keras 进行手写数字识别 小结 0. 前言 深度学习已经成为机器学习中最受欢迎和发展最快的领域.自 2012 年深度学习性能超越机器学习等传统方法以来,深度学习架构开始快速应用于包括计算机视觉

  • Python PaddleNLP实现自动生成虎年藏头诗

    目录 一. 数据处理 1.paddlenlp升级 2.提取诗头 3.生成词表 4.定义dataset 二.定义模型并训练 1.模型定义 2.模型训练 3.模型保存 三.生成藏头诗 总结 一. 数据处理 本项目中利用古诗数据集作为训练集,编码器接收古诗的每个字的开头,解码器利用编码器的信息生成所有的诗句.为了诗句之间的连贯性,编码器同时也在诗头之前加上之前诗句的信息.举例: “白日依山尽,黄河入海流,欲穷千里目,更上一层楼.” 可以生成两个样本: 样本一:编码器输入,“白”:解码器输入,“白日依山

  • 利用Python编写一个藏头诗在线生成器

    目录 导语 正文 一.藏头诗(“小浪漫”) 二.实现代码 三.效果展示 导语 我寻竹马旅尘埃,喜见梅花独自开. 欢得东风无限好,你似故人有缘来. ——顾木子吖 你看懂了嘛? 哈喽大家好,我是木木子,上一期的唐诗宋词元曲鉴赏中华古诗词之美已经发出来给大家品读了. 这一期的话是上一期的延续哈~听说藏头诗这用来表白貌似也不错哈. 可爱有趣的藏头诗情话——来~我们来康康叭! 正文 一.藏头诗(“小浪漫”) 又要上班了我们来发个牢骚——想想下一个国家法定节日就得等到元旦了 就很难过,好漫长啊!你是不是也挺

  • Python利用sqlacodegen自动生成ORM实体类示例

    本文实例讲述了Python利用sqlacodegen自动生成ORM实体类.分享给大家供大家参考,具体如下: 在前面一篇<Python流行ORM框架sqlalchemy安装与使用>我们是手动创建了一个名叫Infos.py的文件,然后定义了一个News类,把这个类作为和我们news数据表的映射. from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() from sqlalchemy impo

  • python 利用toapi库自动生成api

    在学习做接口测试自动化的时候,我们往往会自己动手写一些简单的API,比如写一个简单的TODO API之类. 不过自己写API的时候经常需要造一些假数据,以及处理分页逻辑,开始的时候还觉得比较有意思,但久而久之就显得比较乏味了. 这时候你可能会想,有没有什么工具可以自动将一个线上的网站转化成简单的API呢? 这样的工具确实是存在的,而且不少,其中python语言中比较受欢迎的实现是https://github.com/gaojiuli/toapi项目,项目名称是toapi. 我们来简单体验一下这个

  • python工具快速为音视频自动生成字幕(使用说明)

    为音视频自动生成字幕的 python 工具 autosub 是一个能自动为音视频生成字幕的 python 包,以下为其简介和使用说明. autosub autosub原本使用 python 2.X 开发,仅支持 linux 和 macos 系统,现已停止维护 其原理是对音视频文件进行语音活动检测以查找说话的区域,然后并行调用 Google Web Speech API 进行转录,(可选)翻译成目标语言,并将结果存储下来. autosub3 基于 autosub,升级到 python 3.X 版本

  • 利用Python自制网页并实现一键自动生成探索性数据分析报告

    目录 前言 上传文件以及变量的筛选 前言 今天小编带领大家用Python自制一个自动生成探索性数据分析报告这样的一个工具,大家只需要在浏览器中输入url便可以轻松的访问,如下所示: 第一步 首先我们导入所要用到的模块,设置网页的标题.工具栏以及logo的导入,代码如下: from st_aggrid import AgGrid import streamlit as st import pandas as pd import pandas_profiling from streamlit_pan

  • python实现自动生成C++代码的代码生成器

    遇到的问题 工作中遇到这么一个事,需要写很多C++的底层数据库类,但这些类大同小异,无非是增删改查,如果人工来写代码,既费力又容易出错:而借用python的代码自动生成,可以轻松搞定: (类比JAVA中的Hibernate自动生成的数据库底层操作代码) 下面介绍使用python字符串替换的方法: Python字符串替换的几种方法 1. 字符串替换 将需要替换的内容使用格式化符替代,后续补上替换内容: template = "hello %s , your website is %s "

  • Python3自动生成MySQL数据字典的markdown文本的实现

    为啥要写这个脚本 五一前的准备下班的时候,看到同事为了做数据库的某个表的数据字典,在做一个复杂的人工操作,就是一个字段一个字段的纯手撸,那速度可想而知是多么的折磨和锻炼人的意志和耐心,反正就是很耗时又费力的活,关键是工作效率太低了,于是就网上查了一下,能否有在线工具可用,但是并没有找到理想和如意的,于是吧,就干脆自己撸一个,一劳永逸,说干就干的那种-- 先屡一下脚本思路 第一步:输入或修改数据库连接配置信息,以及输入数据表名 第二步:利用pymysql模块连接数据库,并判断数据表是否存在 第三步

  • 详解python脚本自动生成需要文件实例代码

    python脚本自动生成需要文件 在工作中我们经常需要通过一个文件写出另外一个文件,然而既然是对应关系肯定可以总结规律让计算机帮我们完成,今天我们就通过一个通用文件生成的python脚本来实现这个功能,将大家从每日重复的劳动中解放! 定义一个函数 def produceBnf(infilename,outfilename): List=[] with open(infilename,'r') as inf: for line in inf.readlines(): List.append(re.

  • 利用python自动生成docker nginx反向代理配置

    利用python自动生成docker nginx反向代理配置 由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候,自动生成nginx反向代理,然后reload nginx 我的原则是尽量简单,轻量,内存占用少 目标很明确,只要能监听到docker的容器启动/停止事件,即可 网上查了一下可以用docker events来监听docker事件,试了一下

随机推荐