Python基础知识

2023-10-27

前言

  Python基础知识。

一、Python虚拟环境

1、Python虚拟环境的意义:

  在实际项目开发中,我们通常会根据自己的需求去下载各种相应的框架库,如Scrapy、Beautiful Soup等,但是可能每个项目使用的框架库并不一样,或使用框架的版本不一样,这样需要我们根据需求不断的更新或卸载相应的库。在多个项目同时进行的过程中,对其他项目造成很多不必要的麻烦,管理也相当混乱。通过创建python虚拟环境,可以将不同项目需要的python开发环境封装在一个独立空间中,在这个空间中,安装项目需要的各种python包,这样将不同项目独立开来,便于开发管理。

2、Python构造虚拟环境的方法

  • 创建虚拟环境
    conda create -n 虚拟环境名称 python=*(python版本)
    
    例:conda create -n venv1 python=3.8
    
    注:虚拟环境名称确定了,会建立个同名的文件夹,后续虚拟环境中安装的包都会在这个文件目录下
    
  • 激活虚拟环境
    conda activate 虚拟环境名称
    
    例:conda activate venv1
    
  • 退出虚拟环境
    conda deactivate
    
    例:conda deactivate
    
  • 删除虚拟环境
    conda remove --name 虚拟环境名称 --all
    
    conda remove --name venv1 --all
    
  • 其他有用命令
    # 列出系统存在虚拟环境
    conda info -e或者conda env list
    
    # 查看当前环境下已安装的包
    conda list
    
    # 查看某个指定环境的已安装包
    conda list -n venv1
    
    # 查找某个package信息
    conda search numpy
    
    # 安装package
    conda install -n venv1 numpy
    # 如果不用-n指定环境名称,则被安装在当前激活环境
    # 也可以通过-c指定通过某个channel安装
    
    # 更新package
    conda update -n venv1 numpy
    
    # 删除package
    conda remove -n venv1 numpy
    

3、Python虚拟环境问题处理

  • clear命令失效
    • 问题描述:当使用clear命令的时候,出现了下面的错误。
      ~$ clear
      terminals database is inaccessible
      
    • 解决办法:执行下面的命令之后,该错误被解决。
      ~$ export TERMINFO=/usr/share/terminfo
      
    • 备注:最好是将上面那条export命令添加到~.bashrc中。

二、Python其他知识点

1、pip忽略缓存安装

pip --no-cache-dir install xxx

2、镜像源

Python镜像源

3、python查找项目依赖

  • 链接查找python项目依赖的两种方法
  • 说明:项目开发的时候,总是要搭建和部署环境,这时,就需要一个python第三方包的list,一般叫做requirements.txt。如果项目使用virtualenv环境,直接使用pip freeze即可,但是如果项目的依赖没有维护,就会很麻烦,这时我们就需要一个叫pipreqs的工具,可以帮助我们自动生成requirements.txt文件;
  • 方法
    • 使用pip freeze
      pip freeze > requirements.txt
      
      # 这种方式配合virtualenv 才好使,否则把整个环境中的包都列出来了。
      
    • 使用pipreqs
      安装:
      	pip install pipreqs
      
      用法:   
      	在项目的根目录下使用    pipreqs ./   
      
      注:
      	如果是Windows系统,会报编码错误 (UnicodeDecodeError: 'gbk' codec can't decode byte 0xa8 in position 24: illegal multibyte sequence)  ,使用时,指定编码格式:pipreqs ./ --encoding=utf8
      
      生成requirements.txt 文件后,可以根据这个文件下载所有的依赖
      用法:
      	pip install -r requriements.txt 即可
      
      如果遇到connection问题,使用如下命令:
      	pipreqs ./ --pypi-server http://pypi.douban.com/simple/
      
      这个工具的好处是可以通过对项目目录的扫描,自动发现使用了那些类库,自动生成依赖清单。
      缺点是可能会有些偏差,需要检查并自己调整下。
      

4、python环境变量设置

PATH、PYTHONPATH、sys.path


PATH
作用:
    定义python解释器路径
    
设置方法(当前用户永久生效):
    vi ~/.bashrc
    export PATH=$PATH:{python解释器所在目录},例如export PATH=$PATH:/home/zhangce/anaconda3/bin
    source ~/.bashrc

PYTHONPATH
作用:
    定义python模块的搜索路径

设置方法:
    vi ~/.bashrc
    export PYTHONPATH=$PYTHONPATH:{python模块所在目录},例如export PYTHONPATH=$PYTHONPATH:/home/zhangce/anaconda3/lib/python3.8/site-packages
    source ~/.bashrc

sys.path
作用:
    在python文件运行时,动态添加python模块搜索路径

设置方法:
    import sys
    sys.path.append("/home/zhangce/anaconda3/lib/python3.8/site-packages")

5、代码编辑

python文件的第一行代码一般为:
    # !/usr/bin/env python3
或者
    # !/usr/bin/python3

作用:
    当在命令行,没有指定执行py文件的解释器,此行会指定执行代码的解释器

区别:
    # !/usr/bin/python3 
    表示 python3 解释器所处的绝对路径就是/usr/bin/python3, 路径被写死了
    # !/usr/bin/env/ python3 
    表示从 "PATH环境变量"中查找python3解释器的位置,路径没有被写死,而是在"环境变量"中寻找python3解释器的安装路径,再调用该路径下的解释器来执行脚本。
    显然,采用后者的写法更灵活更具有通用性,推荐使用这种写法。

优先级:
    python3 test.py的优先级最高,无论代码首行指定的是哪个解释器版本,都比以命令行输入的python解释器要弱。

6、列表拷贝

【浅拷贝】
A = A1
# 说明:
# 改变A1的值,A的值也会发生变化    

【copy浅拷贝】
A1 = A.copy()
#或者
import copy
A1 = copy.copy(A)    
# 说明:
# 改变A1的值,A的值不会发生改变,除非A中包含子对象,比如:
                     #A = [0,1,2,[3,4,5],6,7,8]
                     #A  copy拷贝给A1之后,若给A1添加一个元素9,则:
                     #A = [0,1,2,[3,4,5],6,7,8]  而A1 = [0,1,2,[3,4,5],6,7,8,9]
                     #若给A1[3]这个元素[3,4,5]添加一个元素9,则:
                     #A = [0,1,2,[3,4,5,9],6,7,8]   A1 = [0,1,2,[3,4,5,9],6,7,8]

【深拷贝】
import copy
A1 = copy.deepcopy(A)   
# 说明:
# 深拷贝则是无论A有无子对象,A1改变,A也不会发生改变。

7、vscode

  • 问题:如果vscode导入包时,出现如下提示,则按照下面解决办法解决。
    Import "XXX" could not be resolved Pylance reportMissingImports
    
  • 解决办法
    1、打开.vscode文件下的settings.json文件
    2、添加如下代码块:
        {
            "python.analysis.extraPaths": ["/home/work/anaconda3/envs/zhangce-chatgpt/bin"]
        }
        其中:list中存储的是上述问题模块的路径
    

8、小工具

9、日志工具loguru

# 安装
pip install loguru

# 使用
from loguru import logger
from pathlib import Path
import time

# 获取当前工作路径的上一层路径
project_path = Path.cwd().parent
# 构建日志输出目录
log_path = Path(project_path, "logs")
# 构建时间变量
today = time.strftime("%Y_%m_%d")
# 构建日志工具
logger.add(f"{log_path}/ernie_bot_{today}.log", rotation='100MB', encoding="utf-8", retention=3, level="INFO")

# rotation='100MB':每100M创建一个新日志
# retention=3:同时保留三个日志文件

三、类相关知识点

1、静态方法和类方法

@staticmethod和@classmethod

相同点:
a. 都可以使用类对象和类对象实例访问

不同点:
a. @classmethod是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 
b. 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。
c. 普通对象方法至少需要一个self参数,代表类对象实例。
d. 类方法有类变量cls传入,从而可以用cls做一些相关的处理。
e. 对于类方法,可以通过类来调用,就像C.f(), 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。
f. 静态方法则没有cls参数,它基本上跟一个全局函数相同。
d. 有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。

例:
class A(object):
    @classmethod
    def cm(cls):
        print('类方法cm(cls)调用者:', cls.__name__)
    @staticmethod
    def sm():
        print('静态方法sm()被调用')

class B(A):
    pass

A.cm()
B.cm()
A.sm()
B.sm()

# 输出:
# 类方法cm(cls)调用者: A
# 类方法cm(cls)调用者: B
# 静态方法sm()被调用
# 静态方法sm()被调用

2、super()方法

  参考Python的super函数直观理解

super的作用就是执行父类的方法,虽然这句话不完全对,但是也差不多是那么个意思了。

1super方法简介
比如以单继承为例:
class A:
    def p(self):
        print('A')
class B(A):
    def p(self):
        super().p()
B().p()

输出:A

可以看到B().p()其实就是执行的A.p

2、MRO简介
class A:
    def p(self):
        print('A')
class B():
    def p(self):
        print('B')
class C(A,B):
    def p(self):
        print('C')
class D(C):
    def p(self):
        print('D')
a = A()
b = B()
c = C()
d = D()

四个类的MRO (可以通过查看__mro__属性获得,例如A.__mro__)) 分别是:

A: (A, object)
B: (B, object)
C: (C, A, B, object)
D: (D, C, A, B, object)

什么意思呢,我们以A类为例,它的MRO顺序是他自己和object,很好理解,因为python里一切都是对象,所以你可以看到四个类的终点都是object。那C类的MRO也好理解,第一个顺序永远是自己,然后按照代码顺序依次是A,B,最后是object3super用法

super本身其实就是一个类,super()其实就是这个类的实例化对象,它需要接收两个参数 super(class, obj),它返回的是obj对应类的MRO中class类的父类(或者说在MRO中按顺序的下一个类,下同):

class:就是类,这里你可以是A,B,C或者D
obj:就是一个具体的实例对象,即a,b,c,d。我们经常在类的__init__函数里看到super的身影,而且一般都是写成这个样子的super(className, self).__init__(),self其实就是某个实例化的对象。

4、举例

例1

super(C, d).p()
前面我们说过super的作用是 返回的是obj的MRO中class类的父类,在这里就表示返回的是d的MRO中C类的父类:
返回的是d对应类的MRO:(D, C, A, B, object)中C类的父类:A
那么super(C, d)就等价于A,那么super(C, d).p()会输出A


例2

super(A, c).p()
返回的是c的MRO中A类的父类:
返回的是c的MRO:(C, A, B, object)中A类的父类:B
所以最后的输出是B


例3

class A:
    def p(self):
        print('A')
class B(A):
    def p(self):
  super().p()
        print('B')
class C(B):
    def p(self):
        print('C')
class D(C):
    def p(self):
        print('D')

d = D()
d.p()
这个很简单,最后只会输出D

那如果D类改成如下样子呢?

class D(C):
    def p(self):
        super().p()
        print('D')
很简单,我们首先写出D的MRO为 (D,C,B,A,object),缺省状态下,super()就表示前一个父类,这里就是C类,那么super().p()就会调用C的p函数,但是C.p里没有调用super,所以就与A,B类无关了,那么最终的输出就是C,D


例4

class A:
    def p(self):
        print('A')
class B(A):
    def p(self):
        super().p()
        print('B')
class C(B):
    def p(self):
        super().p()
        print('C')
class D(C):
    def p(self):
        super().p()
        print('D')
d = D()
d.p()
输出:A B C D


例5

多继承
如果一个类继承多个类,原理一样,我们只要知道了MRO就能知道执行顺序了,比如下面的例子:

class A:
    def __init__(self):
        print('A')
class B:
    def __init__(self):
        print('B')
class C(A,B):
    def __init__(self):
        super(C,self).__init__()
        print('C')
class D(B,A):
    def __init__(self):
        super(B,self).__init__()
        print('D')
        
print(C.__mro__)
print(D.__mro__)
print('initi C:')
c = C()
print('initi D:')
d = D()

输出结果为

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
initi C:
A
C
initi D:
A
D

结果解释,C 初始化后的打印结果应该很好理解,首先需要执行 super(C,self) 的_init_ 函数,根据C 的MRO可以知道super(C,self) 返回的是A ,所以可以看到最后的确是先打印出了A,然后是C
我们再看D 初始化的结果,注意执行的是super(B,self) ,根据D 的MRO我们可以知道返回的是A 所以打印的结果也是 A,然后打印出了D


总结
对于无论有多少个super(class, obj),我们首先需要知道obj的MRO是什么,然后找到class的前一个class是什么就好了。

super().__init__()xxxClass.__init__(self)的关系:Python类中super()和__init__()的关系

四、正则表达式

1、反斜杠

一、匹配 \d

被匹配的文本 'abcdef\d1234'

方法一:(不使用r)

普通字符串中\d无特殊含义,所以仅需对\进行转义, 即:'abcdef\\d1234' (此步骤称为:字符转义)
正则表达式中\和\d均有特殊含义,所以需摒弃\和\d的特殊含义,即再进行一次转义(此步骤称为:正则转义)

str1 = 'abcdef\\d1234'  # 因为\为转义符,所以需摒弃\的含义,因此此处为\\
print('原字符串',str1)
print('1. ',re.findall('\\\\d',str1))
 
控制台输出结果
# 原字符串 abcdef\d1234
# 1.  ['\\d']


方法二:(使用r)

r'' 代表raw string 原始字符串,引号内括起来的内容所见即所得,所以不需要进行字符转义。即:r'abcdef\d1234'
在正则表达式中\d具有特殊含义,所以需对此进行转义,摒弃\d的特殊含义。即:r'abcdef\\d1234'
所以最终结果为:
str1 = 'abcdef\\d1234'  # 因为\为转义符,所以需摒弃\的含义,因此此处为\\
print('原字符串',str1)
print('2. ',re.findall(r'\\d',str1))
 
控制台输出结果
# 原字符串 abcdef\d1234
# 2.  ['\\d']


二、匹配\\d

被匹配的文本 'abcdef\\d1234'

方法一:(不使用r)

字符转义。即'abcdef\\\\d1234'
正则转义(对前三个\转义和\d转义)。即'abcdef\\\\\\\\d1234'

方法二:(使用r)

r所见即所得,无需转义。即r'abcdef\\d1234'
正则转义。即r'abcdef\\\\d1234'
str2 = 'abcdef\\\\d1234'
print('原字符串',str2)
print('3. ',re.findall('\\\\\\\\d',str2))
print('4. ',re.findall(r'\\\\d',str2))
 
控制台结果
# 原字符串 abcdef\\d1234
# 3.  ['\\\\d']
# 4.  ['\\\\d']

2、“\1\n\2”

re.sub(pattern, r"\1\n\2", content)

"\1\n\2": 在第一个和第二个组之间用\n替换
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python基础知识 的相关文章

  • Python 3 os.urandom

    在哪里可以找到完整的教程或文档os urandom 我需要获得一个随机 int 来从 80 个字符的字符串中选择一个字符 如果你只需要一个随机整数 你可以使用random randint a b 来自随机模块 http docs pytho
  • 递归 lambda 表达式可能吗?

    我正在尝试编写一个调用自身的 lambda 表达式 但我似乎找不到任何语法 或者即使它是可能的 本质上我想将以下函数传输到以下 lambda 表达式中 我意识到这是一个愚蠢的应用程序 它只是添加 但我正在探索可以在 python 中使用 l
  • 如何在Python中流式传输和操作大数据文件

    我有一个相对较大 1 GB 的文本文件 我想通过跨类别求和来减小其大小 Geography AgeGroup Gender Race Count County1 1 M 1 12 County1 2 M 1 3 County1 2 M 2
  • 如果未引发异常,则通过 Python 单元测试

    在Python中unittest框架 是否有一种方法可以在未引发异常的情况下通过单元测试 否则会因 AssertRaise 而失败 如果我正确理解你的问题 你could做这样的事情 def test does not raise on va
  • 如何在 Python 中加密并在 Java 中解密?

    我正在尝试在 Python 程序中加密一些数据并将其保存 然后在 Java 程序中解密该数据 在Python中 我像这样加密它 from Crypto Cipher import AES KEY 1234567890123456789012
  • 一段时间后终止线程的最 Pythonic 方法

    我想在线程中运行一个进程 它正在迭代一个大型数据库表 当线程运行时 我只想让程序等待 如果该线程花费的时间超过 30 秒 我想终止该线程并执行其他操作 通过终止线程 我的意思是我希望它停止活动并优雅地释放资源 我认为最好的方法是通过Thre
  • 在 Windows 上使用 apache mod_wsgi 运行 Flask 应用程序时导入冲突

    我允许您询问我在 Windows 上使用您的 mod wsgi portage 托管 Flask 应用程序时遇到的问题 我有两个烧瓶应用程序 由于导入冲突 只有一个可以同时存在 IE 如果请求申请 1 我有回复 然后 如果我请求应用程序 2
  • .pyx 文件出现未知文件类型错误

    我正在尝试构建一个包含 pyx 文件的 Python 包 pyregion 但在构建过程中出现错误 检查以下输出 python setup py build running build running build py creating b
  • Tensorflow 与 Keras 的兼容性

    我正在使用 Python 3 6 和 Tensorflow 2 0 并且有一些 Keras 代码 import keras from keras models import Sequential from keras layers impo
  • Geodjango距离查询未检索到正确的结果

    我正在尝试根据地理位置的接近程度来检索一些帖子 正如您在代码中看到的 我正在使用 GeoDjango 并且代码在视图中执行 问题是距离过滤器似乎被完全忽略了 当我检查查询集上的距离时 我得到了预期距离 1m 和 18km 但 18km 的帖
  • 使用 Keras np_utils.to_categorical 的问题

    我正在尝试将整数的 one hot 向量数组制作为 keras 将能够使用的 one hot 向量数组来拟合我的模型 这是代码的相关部分 Y train np hstack np asarray dataframe output vecto
  • 在 keras 中保存和加载权重

    我试图从我训练过的模型中保存和加载权重 我用来保存模型的代码是 TensorBoard log dir output model fit generator image a b gen batch size steps per epoch
  • Mac OSX 10.6 上的 Python mysqldb 不工作

    我正在使用 Python 2 7 并尝试让 Django 项目在 MySQL 后端运行 我已经下载了 mysqldb 并按照此处的指南进行操作 http cd34 com blog programming python mysql pyth
  • 在系统托盘中隐藏 tkinter 窗口 [重复]

    这个问题在这里已经有答案了 我正在制作一个程序来提醒我朋友的生日 这样我就不会忘记祝福他们 为此 我制作了两个 tkinter 窗口 1 First one is for entering name and birth date 2 Sec
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • 动态过滤 pandas 数据框

    我正在尝试使用三列的阈值来过滤 pandas 数据框 import pandas as pd df pd DataFrame A 6 2 10 5 3 B 2 5 3 2 6 C 5 2 1 8 2 df df loc df A gt 0
  • 在 Django 查询中使用 .extra(select={...}) 引入的值上使用 .aggregate() ?

    我正在尝试计算玩家每周玩游戏的次数 如下所示 player game objects extra select week WEEK games game date aggregate count Count week 但姜戈抱怨说 Fiel
  • Django Admin 中的反向内联

    我有以下 2 个型号 现在我需要将模型 A 内联到模型 B 的页面上 模型 py class A models Model name models CharField max length 50 class B models Model n
  • 混淆矩阵不支持多标签指示符

    multilabel indicator is not supported是我在尝试运行时收到的错误消息 confusion matrix y test predictions y test is a DataFrame其形状为 Horse
  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练

随机推荐

  • 学生成绩管理系统

    一个年级 相当链表A 该年级5个班 每个班5个人 相当于链表B1 B5 做一个学生成绩管理系统 include
  • C/C++操作文件

    1 C 给字符数组内文件名排序 假设我们获得到的文件名列表是一个二维字符数组 给这样的数据排序首先要获得排序所需的关键字 如下 void getNum char dstChar int num 首先要知道字符串长啥样 用字符串中的哪几个位置
  • cartographer 处理IMU(激光,里程计等)流程

    1 cartographer ros 入口文件 node main cc 入口函数main 如下图 ros init argc argv cartographer node ros start cartographer ros Scoped
  • hduoj 2014

    青年歌手大奖赛 评委会打分 Problem Description 青年歌手大奖赛中 评委会给参赛选手打分 选手得分规则为去掉一个最高分和一个最低分 然后计算平均得分 请编程输出某选手的得分 Input 输入数据有多组 每组占一行 每行的第
  • Android8.1 Settings中恢复出厂设置中添加一个清除数据的按钮

    1 packages apps Settings res layout master clear confirm xml b res layout master clear confirm xml
  • 【Ubuntu22使用过程问题记录】

    Ubuntu22 04 使用过程问题解决方案 1 系统基本设置 1 1 输入法 增加中文输入 1 Settings gt Region Language gt Manage Installed Languages gt 选中chinese
  • jmeter压测报错Non HTTP response code: java.net.ConnectException/Non HTTP response message: Connection ti

    最近在做性能测试过程中遇到了高并发时 后台监控各项指标都很正常 但是测试结果中很多Non HTTP response code java net SocketException Non HTTP response message Permi
  • 签名服务器调用接口

    package teste import java io UnsupportedEncodingException import java net URLEncoder import cn com infosec netsign agent
  • html前端技术开发,CSS标准文档流,建议收藏

    开始 我大学读的是大专 在学校学的是机电一体化 临近毕业的时候选择了学习web前端技术 因为做机电实在又累工资又低 而我更喜欢坐办公室的工作 有空调吹 我很现实 就是想多赚一点钱 到现在做了两年前端的小程序员 月薪是13K 经历过两次跳槽
  • GitLab WorkFlow

    在团队开发中 为了更好的协作 通常会采用一些工作流来最大程度提升效率 生产一个软件工序是比较复杂的 如果通过一个好的逻辑顺序去应用到一个软件开发的生命周期过程是非常重要的 GitLab WorkFlow 从构思到上线的十步 想法 每一个新建
  • 初学react(七):if 判断

    思路 先定义一个state里的一个状态 因为如果状态改变都会重新执行render 所以在render写上判断动态的赋值 也可以使用三目运算 import React from react import App css import Pers
  • jeesite框架介绍

    1 jeesite框架介绍 http wenku baidu com view 7e543c24e45c3b3567ec8baf html 2 jeesite开发环境搭建及部署 http wenku baidu com link url L
  • python3 题解(34 棋盘放麦子)

    棋盘放麦子 问题 国际象棋的棋盘有共有64格 传说国王为奖励它的发明人 答应了他的一个 小 要求 在棋盘的第1格放1粒小麦 第2格放2粒 第3格放4粒 第4格放8粒 每一格是前一格数目的2倍 这一共是多少小麦呢 是个天文数字 请你利用计算机
  • 【Linux篇】父子进程间的数据共享

    include
  • unity期末:从AR的角度观察与实现粒子系统效果

    一 前言 本次项目为本学期unity游戏编程的最后一次制作内容 同时也是期末大作业的考查内容 本次大作业的要求如下 内容 请参考以下技术主题 但不限于这些主题 运用手机拍若干全景图 贴到天空盒或球型天空 做一个简单校园漫游功能 粒子系统效果
  • C++STL库神器:nth_element() 详解

    nth element nth element 函数头文件 algorithm h 功能介绍 arr n 默认求第m大的元素 std nth element arr arr m arr n 定义cmp可求第m小的元素 bool cmp in
  • 单台服务器docker如何搭建rabbitmq集群

    文章目录 一 创建多个RabbitMQ容器 二 将RabbitMQ节点加入到集群中 三 测试 四 在多台服务器上部署RabbitMQ集群 五 通过nginx实现负载均衡 六 如何给RabbitMQ容器添加用户 七 碰到的问题 1 本文是在同
  • Altium AD20过孔盖油,通过设计规则实现过孔盖油,简便实用不会造成遗漏出错

    如果是将PCB源文件发给加工厂 只需说明过孔盖油 板厂就会帮你完成对应的操作 但为了避免源文件泄露 会选择Gerber文件 这时候过孔盖油就要自己来做了 如果没有对规则进行设置 那么切换到Solder层 默认的视图应该是这样的 过孔的周围多
  • Nginx 概述 如何正规安装 静态网页配置 反向代理配置 负载均衡配置

    目录 1 基本概念 1 1 Nginx初步认识 1 2 正向 反向代理 1 3 域名和IP 2 Nginx安装和配置 2 1 安装Nginx 2 2 配置 3 Nginx的使用 3 1 部署静态网页 3 2 反向代理和负载均衡 1 反向代理
  • Python基础知识

    目录 前言 一 Python虚拟环境 1 Python虚拟环境的意义 2 Python构造虚拟环境的方法 3 Python虚拟环境问题处理 二 Python其他知识点 1 pip忽略缓存安装 2 镜像源 3 python查找项目依赖 4 p