作者: kukey-admin

  • python库flask-2.2.5依赖

    Flask-2.2.5
    Jinja2-3.1.4
    click-8.1.7
    colorama-0.4.6
    flask-2.2.5
    importlib-metadata-6.7.0
    itsdangerous-2.1.2
    typing-extensions-4.7.1
    zipp-3.15.0


     

    Collecting flask
    Downloading https://files.pythonhosted.org/packages/9f/1a/8b6d48162861009d1e017a9740431c78d860809773b66cac220a11aa3310
    /Flask-2.2.5-py3-none-any.whl (101kB)
    100% |████████████████████████████████| 102kB 259kB/s
    Requirement already satisfied: Werkzeug>=2.2.2 in c:\users\rkey\source\repos\文件上传下载\env\lib\site-packages (from fl
    ask) (2.2.3)
    Collecting click>=8.0 (from flask)
    Downloading https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229
    /click-8.1.7-py3-none-any.whl (97kB)
    100% |████████████████████████████████| 102kB 1.1MB/s
    Collecting Jinja2>=3.0 (from flask)
    Downloading https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36
    /jinja2-3.1.4-py3-none-any.whl (133kB)
    100% |████████████████████████████████| 143kB 428kB/s
    Collecting itsdangerous>=2.0 (from flask)
    Downloading https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae
    /itsdangerous-2.1.2-py3-none-any.whl
    Collecting importlib-metadata>=3.6.0; python_version < “3.10” (from flask)
    Downloading https://files.pythonhosted.org/packages/ff/94/64287b38c7de4c90683630338cf28f129decbba0a44f0c6db35a873c73c4
    /importlib_metadata-6.7.0-py3-none-any.whl
    Requirement already satisfied: MarkupSafe>=2.1.1 in c:\users\rkey\source\repos\文件上传下载\env\lib\site-packages (from
    Werkzeug>=2.2.2->flask) (2.1.5)
    Collecting colorama; platform_system == “Windows” (from click>=8.0->flask)
    Downloading https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221
    /colorama-0.4.6-py2.py3-none-any.whl
    Collecting zipp>=0.5 (from importlib-metadata>=3.6.0; python_version < “3.10”->flask)
    Downloading https://files.pythonhosted.org/packages/5b/fa/c9e82bbe1af6266adf08afb563905eb87cab83fde00a0a08963510621047
    /zipp-3.15.0-py3-none-any.whl
    Collecting typing-extensions>=3.6.4; python_version < “3.8” (from importlib-metadata>=3.6.0; python_version < “3.10”->fl
    ask)
    Downloading https://files.pythonhosted.org/packages/ec/6b/63cc3df74987c36fe26157ee12e09e8f9db4de771e0f3404263117e75b95
    /typing_extensions-4.7.1-py3-none-any.whl
    Installing collected packages: zipp, typing-extensions, importlib-metadata, colorama, click, Jinja2, itsdangerous, flask

    Found existing installation: Jinja2 2.3.1
    Uninstalling Jinja2-2.3.1:
    Successfully uninstalled Jinja2-2.3.1
    Successfully installed Jinja2-3.1.4 click-8.1.7 colorama-0.4.6 flask-2.2.5 importlib-metadata-6.7.0 itsdangerous-2.1.2 t
    yping-extensions-4.7.1 zipp-3.15.0
    You are using pip version 18.1, however version 24.0 is available.
    You should consider upgrading via the ‘python -m pip install –upgrade pip’ command.

  • 无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-|1-1-0.dll。尝试重新安装该程序以解决此问题。

    放弃吧,直接上传一个win10镜像,把系统换了


     

    最近在Windows Server 2008 R2 Datacenter 服务器上安装python,把python的安装包复制过去发现无法安装,提示

    Setup failed
    
    One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the log file.
    
    Windows Server 2008 R2 Service Pack 1 and all applicable updates are required to install Python 3.8.5 (64-bit).
    
    Please update your machine and then restart the installation.

    由于我的电脑是64位的系统,服务器上的这个系统也是64位的,于是我把我电脑上安装的python文件夹给打包传输到服务器上,然后再服务器的相同位置解压,

    把环境变量配置了一下

    cmd运行python发现又有了新的提示:

    无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-|1-1-0.dll。尝试重新安装该程序以解决此问题。

    看到网上需要下载安装Microsoft Visual C++ Redistributable,找了个教程安装了一下,

    安装Microsoft Visual C++ Redistributable教程:

    https://zhuanlan.zhihu.com/p/680265004

    Microsoft Visual C++ Redistributable的详情页面:

    https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170

    Microsoft Visual C++ Redistributable的下载链接:

    https://aka.ms/vs/17/release/vc_redist.x64.exe

    现在cmd运行python又有了新的提示

    C:\Users\Administrator>python
    Error processing line 7 of C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\site-packages\pywin32.pth:
    
      Traceback (most recent call last):
        File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\site.py", line 169, in addpackage exec(line)
        File "<string>", line 1, in <module>
        File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\site-packages\win32\lib\pywin32_bootstrap.py", line 23, in <module> 
        os.add_dll_directory(path) 
        cookie = nt._add_dll_directory(path)
      OSError: [WinError 127] 找不到指定的程序。: 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\pywin32_system32'
    
    Remainder of file ignored
    Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AM
    D64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>>

     

  • flask禁止未登录访问指定路由的思路

    定义一个未登录需要禁止访问的路由列表

    判断是否登录,若未登录则判断访问的路由是否在列表里,若在列表里则不允许访问,给出提示

    @app.before_request
    def create_tables():
        db.create_all()
        # 定义一个列表,包含需要保护的路由
        rute_list = ['/modify_chapter', '/modify_book', '/add_book', '/add_chapter']
        # 检查用户是否登录
        if 'logged_in' not in session:
            if request.endpoint in rute_list:
                # 如果用户未登录,重定向到登录页面,并告诉登录页面登录后要重定向回这个地址
                return '不允许'

     

  • flask登录控制显示内容

    以下是登录和登出的逻辑

    @app.route('/login', methods=['GET', 'POST'])
    def login():
        if request.method == 'POST':
            username = request.form['username']
            password = request.form['password']
            if username == 'admin' and password == 'admin':
                session['logged_in'] = True
                session['username'] = username
                flash("登陆成功")
                return redirect(url_for('novel_index'))
            else:
                return 'Invalid username or password'
        return redirect(url_for('novel_index'))
    
    
    @app.route('/logout', methods=['GET', 'POST'])
    def logout():
        session.pop('logged_in', None)
        session.pop('username', None)
        return redirect(url_for('novel_index'))

    在登录后设置了session会话值

    session['logged_in'] = True

     

    在网页中获取这个值需要使用

    {% if session.logged_in %}

     

    实际案例如下

    {% if session.logged_in %}
        <!-- 登录表单,实际上用户已经登录,所以可以显示欢迎信息或其他内容 -->
        <form class="navbar-form pull-right" action="/logout" method="post">
            <button type="submit" class="btn">Logout</button>
        </form>
    {% else %}
        <!-- 登录表单 -->
        <form class="navbar-form pull-right" action="/login" method="post">
            <input class="span2" type="text" name="username" placeholder="Username">
            <input class="span2" type="password" name="password" placeholder="Password">
            <button type="submit" class="btn">Sign in</button>
        </form>
    {% endif %}

     

     

  • 获取当前所有进程 python

    # -*- coding: utf-8 -*-
    #!/usr/bin/env python3
    '''
    psutil==6.0.0
    '''
    import psutil
    import tkinter as tk
    from tkinter import ttk
    import socket
    # 定义一个函数来更新列表显示
    def update_list():
        # 获取搜索框中的文本
        search_text = search_entry.get().lower()
        listbox.delete(0, tk.END)  # 清空 listbox
        # 根据搜索文本更新列表显示
        for index, item in enumerate(get_all_processes()):
            if search_text in item.lower():
                if search_text in item.lower():  # 如果搜索文本在进程信息中
                    listbox.insert(tk.END, item)  # 将匹配的进程信息添加到 listbox
            else:
                listbox.selection_clear(index)
    def end_process():
        # 获取选中的进程 ID
        selection = listbox.curselection()
        if selection:
            index = int(selection[0])
            print('索引:',index)
            selection = listbox.get(selection)
            print('selection:',selection)
            parts = selection.split(", ")
            print('parts:',parts)
            # 检查 parts 列表是否有足够的元素
            # 若get_all_processes()函数的拼接方式出现改变,这里的截取方式都需要调整
            pid_part = parts[0].split(":")[1]  # 尝试获取 PID
            pid_part = int(pid_part)  # 将 PID 转换为整数
            name_part = parts[1].split(":")[1]  # "System Idle Process"
            username_part = parts[2].split(":")[1]  # "NT AUTHORITY\SYSTEM"
            print('pid_part:',pid_part,'name_part',name_part,'username_part',username_part)
            try:
                # 通过进程 ID 结束进程
                proc = psutil.Process(pid_part)
                proc.terminate()  # 发送终止信号
                listbox.delete(index)  # 从列表中删除进程项
            except (psutil.NoSuchProcess, psutil.AccessDenied) as e:
                print(f"Error terminating process {pid_part}: {e}")
                listbox.delete(index)  # 从列表中删除进程项
          
    def get_all_processes():
        # 获取当前运行的所有进程的列表
        processes = psutil.process_iter(['pid', 'name', 'username'])
        proList=[]
        for proc in processes:
            try:
                pid = proc.info['pid']
                name = proc.info['name']
                username = proc.info['username']
                # 使用 net_connections() 获取网络连接信息
                # 这里因为获取了当前进程使用的所有端口号,所以可能会拖慢程序的速度,使用过程中的体验就是突然顿了一下又好了
                ports = set()
                for conn in psutil.net_connections(kind='inet'):
                    if conn.pid == pid and conn.type == socket.SOCK_STREAM and conn.status == 'ESTABLISHED':
                        ports.add(conn.laddr.port)
                ports_str = ', '.join(map(str, ports)) if ports else '无'
                process_info = f"进程ID:{pid}, 进程名:{name}, 进程所属用户名:{username}, 使用的端口号:{ports_str}"
                proList.append(process_info)
            except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
                # 忽略已经结束的进程或访问被拒绝的进程
                pass
        return proList
    
    def center_window(window):
        screen_width = window.winfo_screenwidth()
        screen_height = window.winfo_screenheight()
        window_width = window.winfo_reqwidth()
        window_height = window.winfo_reqheight()
        x = (screen_width // 2) - (window_width // 2)
        y = (screen_height // 2) - (window_height // 2)
        window.geometry(f'+{x}+{y}')
    # 创建主窗口
    root = tk.Tk()
    root.title("Tkinter List Search")
    root.geometry("400x400")
    center_window(root)
    # 创建搜索框
    search_frame = tk.Frame(root)
    search_label = tk.Label(search_frame, text="Search:")
    search_label.pack(side=tk.LEFT)
    search_entry = tk.Entry(search_frame)
    search_entry.pack(side=tk.LEFT, expand=True, fill=tk.X)
    search_entry.bind("<Return>", lambda event: update_list())
    search_frame.pack(fill=tk.X)
    
    # 创建列表显示
    listbox = tk.Listbox(root)
    listbox.pack(fill=tk.BOTH, expand=True)
    
    # 填充列表
    for item in get_all_processes():
        print(item)
        listbox.insert(tk.END, item)
    
    # 搜索框获得焦点
    search_entry.focus()
    
    # 更新列表的函数绑定到搜索框的键入事件
    search_entry.bind("<KeyRelease>", lambda event: update_list())
    
    # 创建右键菜单
    right_click_menu = tk.Menu(root, tearoff=0)
    end_process_item = right_click_menu.add_command(label="结束进程", command=end_process)
    # 绑定右键点击事件到 Listbox
    listbox.bind("<Button-3>", lambda event: right_click_menu.post(event.x_root, event.y_root))
    
    if __name__ == "__main__":
        root.mainloop()

     

  • docker

    docker常用命令

    来源公众号:运维朱工 2024年06月16日 09:21 浙江

    Docker 是一个用于开发、交付和运行应用程序的平台,且提供了一系列命令来管理镜像、容器、网络和存储卷等资源。

    docker生命周期相关命令

    这些命令用于管理容器的生命周期,包括创建、启动、停止、删除等。

    1. docker run 创建并启动一个容器。

      [root@lutixia ~]# docker run -d --name mynginx nginx
      ef5dc799dc80574836c550118fcfcb804af342cc4dbf9fa76599155c3095c6f3
      [root@lutixia ~]#
    2. docker stop 停止一个运行中的容器。

      [root@lutixia ~]# docker stop mynginx
      mynginx
      [root@lutixia ~]#
    3. docker start 启动一个已经存在的容器。

      [root@lutixia ~]# docker start mynginx
      mynginx
      [root@lutixia ~]#
    4. docker restart 重启一个运行中的容器。

      docker restart mynginx
    5. docker rm 删除一个已停止的容器。

      [root@lutixia ~]# docker stop mynginx
      mynginx
      [root@lutixia ~]#
      [root@lutixia ~]# docker rm mynginx
      mynginx
    6. docker ps 列出当前所有运行的容器。

      [root@lutixia ~]# docker ps
      CONTAINER ID   IMAGE                  COMMAND                   CREATED        STATUS             PORTS                       NAMES
      e1ce0b642a10   kindest/node:v1.27.3   "/usr/local/bin/entr…"   9 months ago   Up About an hour   127.0.0.1:42103->6443/tcp   kind-control-plane
      be4ff1a2dce3   kindest/node:v1.27.3   "/usr/local/bin/entr…"   9 months ago   Up About an hour                               kind-worker
      bce1a252b960   kindest/node:v1.27.3   "/usr/local/bin/entr…"   9 months ago   Up About an hour                               kind-worker2
    7. 列出所有容器(包括停止的)。

      docker ps -a

    docker镜像相关命令

    这些命令用于管理 Docker 镜像,包括构建、拉取、删除等。

    1. docker build 从 Dockerfile 构建一个新的镜像。

      docker build -t myimage:latest .
    2. docker pull 从 Docker Hub 或其他仓库拉取一个镜像。

      docker pull nginx
    3. docker push 将本地镜像推送到远程仓库(需要先登录)。

      docker push myimage:latest
    4. docker images 列出本地所有镜像。

      [root@lutixia ~]# docker images
      REPOSITORY     TAG       IMAGE ID       CREATED         SIZE
      kindest/node   <none>    6e360fda99b5   12 months ago   850MB
      nginx          latest    eeb9db34b331   2 years ago     134MB
      busybox        1.28      89a35e2ebb6b   6 years ago     1.28MB
    5. docker rmi 删除一个本地镜像。

      [root@lutixia ~]# docker rmi busybox:1.28
      Untagged: busybox:1.28
      Untagged: busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47
      Deleted: sha256:89a35e2ebb6b938201966889b5e8c85b931db6432c5643966116cd1c28bf45cd
      Deleted: sha256:f4fc038e206e02964abd937c8071a34f1838e0693d2f38657b7d96528bd6dbaa
      [root@lutixia ~]#

    docker容器相关命令

    这些命令用于操作和管理容器内的进程和文件系统。

    1. docker exec 在一个运行中的容器中执行命令。

      [root@lutixia ~]# docker run -d --name mynginx nginx
      5408a427e54782c451b2e06011633ff103b155b5dac98ecf46bef6c71292b81b
      [root@lutixia ~]#
      [root@lutixia ~]# docker exec -it mynginx /bin/bash
      root@5408a427e547:/#
    2. docker logs 查看容器的日志。

      [root@lutixia ~]# docker logs mynginx
      /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
      /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
      /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
      10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
      10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
    3. docker inspect 查看容器的详细信息。

      [root@lutixia ~]# docker inspect mynginx
      [
      {
          "Id": "5408a427e54782c451b2e06011633ff103b155b5dac98ecf46bef6c71292b81b",
          "Created": "2024-06-15T06:56:38.001113943Z",
          "Path": "/docker-entrypoint.sh",
          "Args": [
              "nginx",
              "-g",
              "daemon off;"
          ],
          ...
    4. docker cp 在本地文件系统和容器之间复制文件。

      [root@lutixia ~]# docker cp mynginx:/etc/nginx/nginx.conf /tmp/
      Successfully copied 2.56kB to /tmp/
      [root@lutixia ~]#

    docker网络网络命令

    这些命令用于管理 Docker 的网络,包括创建、查看和删除网络等。

    1. docker network ls 列出所有 Docker 网络。

      [root@lutixia ~]# docker network ls
      NETWORK ID     NAME      DRIVER    SCOPE
      9e5b87fe35d0   bridge    bridge    local
      ea1cedb0b9bd   host      host      local
      218aeeb09820   kind      bridge    local
      c16474a0eb15   none      null      local
    2. docker network create 创建一个新的网络。

      [root@lutixia ~]# docker network create mynetwork
      c39babe9b3f988d64e4e2766c84d2e855a4e031d616ee2ac2b791ee8f470218d
    3. docker network inspect 查看网络的详细信息。

      [root@lutixia ~]# docker inspect network mynetwork
      [
      {
          "Name": "mynetwork",
          "Id":    "c39babe9b3f988d64e4e2766c84d2e855a4e031d616ee2ac2b791ee8f470218d",
          "Created": "2024-06-15T15:01:21.931487302+08:00",
          "Scope": "local",
          "Driver": "bridge",
          "EnableIPv6": false,   
          ...
    4. docker network connect 将一个容器连接到一个网络。

      [root@lutixia ~]# docker network connect mynetwork mynginx
      [root@lutixia ~]# docker inspect network mynetwork  | grep -iC 2 containers
             },
          "ConfigOnly": false,
          "Containers": {
              "5408a427e54782c451b2e06011633ff103b155b5dac98ecf46bef6c71292b81b": {
                  "Name": "mynginx",
    5. docker network disconnect 将一个容器从一个网络断开。

      [root@lutixia ~]# docker network  disconnect mynetwork mynginx
      [root@lutixia ~]#
      [root@lutixia ~]# docker inspect network mynetwork  | grep -iC 2 Containers
          },
          "ConfigOnly": false,
          "Containers": {},

    docker存储卷相关命令

    这些命令用于管理 Docker 的存储卷,包括创建、挂载和删除卷等。

    1. docker volume ls 列出所有存储卷。

      docker volume ls
    2. docker volume create 创建一个新的存储卷。

      docker volume create myvolume
    3. docker volume inspect 查看存储卷的详细信息。

      docker volume inspect myvolume
    4. docker volume rm 删除一个存储卷。

      docker volume rm myvolume
    5. 挂载存储卷到容器 在创建容器时,将存储卷挂载到容器中。

      docker run -d --name mynginx -v myvolume:/data nginx

    这些命令涵盖了 Docker 的主要操作,能够帮助你高效地管理镜像、容器、网络和存储卷。

  • 大模型研究

    qwen2-7b-instruct-fp16.gguf

    文件名解读

    qwen2-7b-instruct-fp16.gguf 这个文件名包含了几个部分,每个部分都提供了关于文件内容的信息。下面是对各部分的可能解释:

    1. qwen2:
      • 这可能是模型名称的一部分,或者是用于区分不同模型系列或版本的标识符。
    2. 7b:
      • 这个参数可能表示模型的参数量级,b 可能代表 billion(十亿)。所以 7b 可能意味着这个模型有 70 亿个参数。
    3. instruct:
      • 这可能指的是模型训练时使用的数据类型或任务类型。在这个上下文中,instruct 可能意味着模型是为指令遵循(instruction following)任务训练的,这种任务通常涉及到理解和执行自然语言指令。
    4. fp16:
      • 这通常表示模型权重的数据类型。FP16(16-bit floating-point)是一种用于存储和计算的半精度浮点数格式,比标准的 FP32(32-bit floating-point)占用更少的内存和存储空间,同时可以减少计算资源的使用,通常用于模型优化和加速。
    5. .gguf:
      • 这很可能是特定于应用程序或框架的文件扩展名,用于表示模型权重或配置的存储格式。这不是一个广泛认可的标准格式,可能是某个特定项目或组织自定义的格式。

    综上所述,qwen2-7b-instruct-fp16.gguf 可能是指一个具有 70 亿参数、为指令遵循任务训练、使用半精度浮点数存储权重,并以特定格式保存的模型文件。

    如果需要更详细的信息或确切的含义,可能需要查看相关的项目文档或联系文件的提供者。如果这个文件是您工作中的一部分,了解这些参数对于理解模型的能力和限制以及如何使用它进行进一步的训练或部署至关重要。

     

    qwen2-7b-instruct-q3_k_m.gguf

    1. q3:
      • 这可能表示模型的特定版本或质量级别。q 可能代表 “quality”(质量),而数字 3 可能表示第三级或第三个迭代。
    2. k:
      • 这个字母可能代表千字(kilo),在数字存储中通常表示 1024。在模型文件名中,k 可能用来表示某个特定的量化级别或模型大小的单位。
    3. m:
      • 这个字母可能代表百万(million),在数字存储中通常表示 1,000,000。它可能与 k 联合使用来描述模型的规模或参数数量。
    4. .gguf:
      • 这是文件扩展名,可能表示模型权重或配置的特定存储格式。如前所述,这不是一个标准格式,可能是特定于某个应用程序或框架的自定义格式。

    综上所述,qwen2-7b-instruct-q3_k_m.gguf 这个文件名可能指的是一个具有 70 亿参数、用于处理指令、质量级别为 3、具有特定量化级别或大小单位、并以 .gguf 格式存储的模型文件。

    请注意,这些解释是基于文件名中每个部分的常见用法和假设。确切的含义可能依赖于该模型的创建者或使用的具体上下文。如果需要准确的解释,最好咨询模型的开发者或维护者。

  • python压测工具locust

    from locust import HttpUser, task, between

    class WebsiteUser(HttpUser):
    wait_time = between(1, 2.5) # 用户之间请求的等待时间范围

    @task
    def view_video(self):
    url = “http://127.0.0.1/video/5-2 go语言的调度器”
    self.client.get(url, name=”/video/…”)

    # 注意:由于 URL 很长且包含特殊字符,我在这里简化了 name 参数以便在 Locust UI 中更容易识别

  • 图片格式转换 python

    from PIL import Image
    import os
    原图片路径 = input("需要转换的图片:")
    新图片路径 = input("新图片名,不写默认原名:")
    新图片格式 = input("新图片格式,不写默认PNG:")
    带后缀的文件名 = os.path.basename(原图片路径)
    不带后缀的文件名, _ = os.path.splitext(带后缀的文件名)
    if len(新图片格式) == 0:
        新图片格式='png'
    if len(新图片路径) == 0:
        if len(原图片路径.replace(带后缀的文件名,'')) == 0:
            新图片路径=不带后缀的文件名+'.'+新图片格式
        else:
            新图片路径=原图片路径.replace(带后缀的文件名,'\\')+不带后缀的文件名+'.'+新图片格式
    print(带后缀的文件名,不带后缀的文件名,新图片格式,新图片路径)
    with Image.open(原图片路径) as img:
        img.save(新图片路径, 新图片格式)

    ”’
    JPEG (.jpeg, .jpg): 使用 ‘JPEG’ 或 ‘JPG’ 作为格式参数。
    PNG (.png): 使用 ‘PNG’ 作为格式参数。
    GIF (.gif): 使用 ‘GIF’ 作为格式参数。
    TIFF (.tiff, .tif): 使用 ‘TIFF’ 或 ‘TIF’ 作为格式参数。
    BMP (.bmp, .dib): 使用 ‘BMP’ 作为格式参数。
    PPM (.ppm, .pbm, .pgm, .pnm): 使用 ‘PPM’ 作为格式参数。
    PSD (.psd): 使用 ‘PSD’ 作为格式参数。
    SGI (.sgi, .rgb, .rgba, .bw): 使用 ‘SGI’ 作为格式参数。
    TGA (.tga): 使用 ‘TGA’ 作为格式参数。
    XBM (.xbm): 使用 ‘XBM’ 作为格式参数。
    ”’

  • 在win上使用nasm写汇编

    安装mingw64,他是一个工具套件。没有去下载安装包或者下载源码去编译一个。

    安装nasm或者masm,前者是谷歌的,后者是微软的。

    把nasm和mingw64的bin目录都加入到环境变量里。

     

    这里以nasm为例。

    找个文件夹,在这个文件夹里创建一个test.asm文件,

    使用记事本或者vscode或者vs打开,

    内容写入

    
    section .text
       global _start     ;必须为链接器(ld)声明
    
    _start:             ;告诉链接器入口点
       mov  edx,len     ;消息长度
       mov  ecx,msg     ;写消息
       mov  ebx,1       ;文件描述符 (stdout)
       mov  eax,4       ;系统调用号 (sys_write)
       int  0x80        ;调用内核
    
       mov  eax,1       ;系统调用号 (sys_exit)
       int  0x80        ;调用内核
    
    section .data
    msg db 'Hello, world!', 0xa  ;要打印的字符串
    len equ $ - msg     ;字符串的长度

    cmd命令行执行以下命令,生成一个.o或.obj文件(.o或.obj都是一个意思)

    nasm -f win64 -o test.obj test.asm