python - 在linux上编译py文件为【.so】文件部署项目运行

news2024/9/27 15:28:34

python - 在linux上编译py文件为【.so】文件,可通过主文件直接执行

一. 前言

在Python中,通常不直接将Python代码编译为.so(共享对象)文件来执行,因为.so文件是编译后的二进制代码,通常用于C或C++等语言,并且它们被设计为可以被Python(通过C API)或其他语言(如C或C++)动态加载和执行。

二.打包编译项目

准备工作

一般linux上都会有GCC编译器,如若没有请先安装
1.安装Cython

pip install cython

2.将以下的脚本放在deploy目录下,项目所有文件放在project下面即可
在这里插入图片描述

1.编译为.c文件的代码

创建一个setup_cmd.py文件

import logging
import os

from setuptools import setup
from Cython.Build import cythonize

# ============================== 配置日志 ===============================
# 定义日志文件的名称
log_filename = 'setup_cmd.log'

# 创建一个日志记录器
logger = logging.getLogger()
logger.setLevel(logging.INFO)  # 设置日志级别为 INFO

# 创建一个文件处理器,并设置级别为 INFO
file_handler = logging.FileHandler(log_filename, encoding='utf-8')  # 指定编码为 utf-8
file_handler.setLevel(logging.INFO)

# 创建一个流处理器(控制台输出),并设置级别为 INFO
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO)

# 创建日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)

# 将处理器添加到日志记录器
logger.addHandler(file_handler)
logger.addHandler(stream_handler)

# ============================== 配置日志 ===============================
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 设置 BASE_DIR
logger.info(f"BASE_DIR -> {BASE_DIR}\n")


# 获取需要编译的文件列表
def get_py_files(directory, exclude_folders, exclude_file_list):
    py_files = []
    for root, dirs, files in os.walk(directory):
        for d in dirs:
            if d in exclude_folders:
                dirs.remove(d)
        for file in files:
            if file in exclude_file_list:
                logger.info(f"不需要编译文件:[{file}] 在 {exclude_file_list} 中!")
                continue

            if file.endswith('.py') and '-' not in file:
                py_files.append(os.path.join(root, file))
    logger.info(f'py_files -> {py_files}')
    logger.info(f'py_files count -> {len(py_files)}')
    return py_files


exclude_folders = ['tests', '.git', '.idea', '__pycache__', 'a-deploy', 'deploy']
exclude_file_list = ['app.py']

# 1.编译打包
file_list = get_py_files(BASE_DIR, exclude_folders, exclude_file_list)
# 单个文件编译或多个文件
# file_list = ['/opt/pkg/project/dev/service/sessionService/service_impl/nw_session_history.py']
setup(
    ext_modules=cythonize(file_list, language_level=3),  # 使用 Python 3 的语言级别
)

1.在linux环境下可直接执行文件

python3 setup_cmd.py

2.windows上直接使用命令执行

python3 setup_cmd.py build_ext --inplace
2.将.c文件转化为.so文件

创建setup_compile_file.py文件
主要是将以下命令拆解执行

gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/usr/local/include/python3.11 -c /opt/pkg/project/dev/base/utils/handle_tasks.c -o build/temp.linux-x86_64-cpython-311/opt/pkg/project/dev/base/utils/handle_tasks.o
gcc -pthread -shared build/temp.linux-x86_64-cpython-311/opt/pkg/project/dev/base/utils/handle_tasks.o -o build/lib.linux-x86_64-cpython-311/handle_tasks.cpython-311-x86_64-linux-gnu.so

代码如下,参考函数:compile_c_files

# -*- coding: utf-8 -*-
import logging
import os
import shutil
import subprocess

from setuptools import setup
from Cython.Build import cythonize

import os

from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED

executor = ThreadPoolExecutor(max_workers=50)

# ============================== 配置日志 ===============================
# 定义日志文件的名称
log_filename = 'setup_compile_file.log'

# 创建一个日志记录器
logger = logging.getLogger()
logger.setLevel(logging.INFO)  # 设置日志级别为 INFO

# 创建一个文件处理器,并设置级别为 INFO
file_handler = logging.FileHandler(log_filename, encoding='utf-8')  # 指定编码为 utf-8
file_handler.setLevel(logging.INFO)

# 创建一个流处理器(控制台输出),并设置级别为 INFO
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO)

# 创建日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)

# 将处理器添加到日志记录器
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
# ============================== 配置日志 ===============================


# BASE_DIR = os.getcwd()
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 设置 BASE_DIR
logger.info(f"BASE_DIR -> {BASE_DIR}\n")

executor = ThreadPoolExecutor(max_workers=10)  # 根据需要调整线程数


# 获取需要编译的文件列表
def get_py_files(directory, exclude_folders, exclude_file_list):
    py_files = []
    for root, dirs, files in os.walk(directory):
        for d in dirs:
            if d in exclude_folders:
                dirs.remove(d)
        for file in files:
            if file in exclude_file_list:
                logger.info(f"不需要编译文件:[{file}] 在 {exclude_file_list} 中!")
                continue

            if file.endswith('.py') and '-' not in file:
                py_files.append(os.path.join(root, file))
    logger.info(f'py_files -> {py_files}')
    logger.info(f'py_files count -> {len(py_files)}')
    return py_files


# 编译扩展模块
def compile_pkg(file_list):
    setup(
        ext_modules=cythonize(file_list, language_level=3),  # 使用 Python 3 的语言级别
    )
    subprocess.run(['python3', 'setup_compile_file.py', 'build_ext', '--inplace'])


#
def copy_compiled_files(source_dir, target_dir, exclude_folders, exclude_file_list):
    """ 拷贝处理编译好的文件 """

    if os.path.exists(target_dir):
        shutil.rmtree(target_dir)
        logger.info(f"已删除旧的目标文件夹: {target_dir}")

    os.makedirs(target_dir)
    logger.info(f"已创建新的目标文件夹: {target_dir}")
    ans = 0
    # 遍历源文件夹  
    for root, dirs, files in os.walk(source_dir):
        # 过滤掉要排除的文件夹  
        dirs[:] = [d for d in dirs if d not in exclude_folders]
        # 遍历当前文件夹中的文件
        for file in files:
            try:
                if file in exclude_file_list:
                    logger.info(f"不拷贝文件:[{file}] 在 exclude_file_list:{exclude_file_list} 中!")
                    continue

                # 构造源和目标文件路径
                src_file = os.path.join(root, file)
                rel_path = os.path.relpath(root, source_dir)
                dst_file = os.path.join(target_dir, rel_path, file)

                # 确保目标文件夹存在
                os.makedirs(os.path.dirname(dst_file), exist_ok=True)

                # 拷贝文件
                shutil.copy2(src_file, dst_file)
                ans += 1
                logger.info(f'文件拷贝成功[src_file]:{src_file} -> [dst_file]:{dst_file}')
            except Exception as e:
                logger.info(f'文件拷贝异常:file:{file} -> error:{e}')
    logger.info(f"已成功拷贝编译文件,数量:{ans}")


def delete_specific_files(folder, extensions, exclude_file_list):
    """
    在指定文件夹中删除所有以extensions中指定的扩展名结尾的文件。

    :param folder: 文件夹路径
    :param extensions: 要删除的文件扩展名列表
    """
    # 遍历文件夹
    logger.info(f"")
    ans = 0
    for root, dirs, files in os.walk(folder):
        for file in files:
            if file in exclude_file_list:
                logger.info(f"不删除文件:[{file}] 在 exclude_file_list:{exclude_file_list} 中!")
                continue
            if file.endswith(tuple(extensions)):
                os.remove(os.path.join(root, file))
                logger.info(f"已删除含有 {extensions} 的文件: {os.path.join(root, file)}")
                ans += 1
    logger.info(f"已删除以{extensions}结尾的文件数量:{ans}")


def compile_c_files(target_dir, extensions, exclude_folders, exclude_file_list):
    """
    编译文件(linux下的命令)
    gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/usr/local/include/python3.11 -c /opt/pkg/project/dev/base/utils/handle_tasks.c -o build/temp.linux-x86_64-cpython-311/opt/pkg/project/dev/base/utils/handle_tasks.o
    gcc -pthread -shared build/temp.linux-x86_64-cpython-311/opt/pkg/project/dev/base/utils/handle_tasks.o -o build/lib.linux-x86_64-cpython-311/handle_tasks.cpython-311-x86_64-linux-gnu.so
    """
    # 遍历文件夹
    ans = 0
    futures = []
    for root, dirs, files in os.walk(target_dir):
        for file in files:
            if file in exclude_file_list:
                logger.info(f"文件:{file} 在 exclude_file_list:{exclude_file_list} 中,不需要编译!")
                continue
            if file.endswith(tuple(extensions)):
                c_path = os.path.join(root, file)
                file_name = file.split('.')[0]
                # o_path = root + '/' + file_name + '.o'
                o_path = os.path.join(root, file_name + '.o')
                # so_path = root + '/' + file_name + '.cpython-311-x86_64-linux-gnu.so'
                so_path = os.path.join(root, file_name + '.cpython-311-x86_64-linux-gnu.so')
                logger.info(f'c_path - > {c_path}')
                logger.info(f'o_path - > {o_path}')
                logger.info(f'so_path - > {so_path}')
                future = executor.submit(compile_file_to_so, c_path, o_path, so_path)
                futures.append(future)
                ans += 1
                logger.info(f'complied count -----> {ans}')
    # 等待所有任务完成
    wait(futures, return_when=ALL_COMPLETED)
    logger.info(f"已编译文件数量:{ans}")


def compile_file_to_so(c_path, o_path, so_path):
    os.system(
        f"gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/usr/local/include/python3.11 -c {c_path} -o {o_path}")
    os.system(
        f"gcc -pthread -shared {o_path} -o {so_path}")
    logger.info(f'File success compiled to - > {so_path}')


def main():
    exclude_folders = ['tests', '.git', '.idea', '__pycache__', 'a-deploy', 'deploy']
    exclude_file_list = ['app.py', 'app.c']
    logger.info(f'项目编译打包开始,源码文件路劲:{BASE_DIR}\n')
    # try:
    #     # 单个文件编译或多个文件
    #     # file_list = ['/opt/pkg/project/dev/service/sessionService/service_impl/nw_session_history.py']
    #
    #     # 1.编译打包
    #     file_list = get_py_files(BASE_DIR, exclude_folders, exclude_file_list)
    #     compile_pkg(file_list)
    #     ...
    # except Exception as e:
    #     logger.info(f'Exception:{e}')

    source_dir = BASE_DIR
    target_dir = os.path.join(BASE_DIR, 'deploy', 'dist')

    # 清除['.c']文件
    extensions = ['.c']
    logger.info(f'开始清除项目中含有{extensions}结尾的文件 [target_dir]:{target_dir}\n')
    delete_specific_files(target_dir, extensions, exclude_file_list)
    logger.info(f'结束清除项目中含有{extensions}结尾的文件 [target_dir]:{target_dir}\n')

    # 2.复制编译好的文件
    logger.info(f'复制拷贝项目开始 [source_dir]:{source_dir} -> [target_dir]:{target_dir}\n')
    copy_compiled_files(source_dir, target_dir, exclude_folders, ['app.c'])
    logger.info(f'复制拷贝项目结束 [source_dir]:{source_dir} -> [target_dir]:{target_dir}\n')

    # # 3.删除py文件
    # extensions = ['.py']
    # logger.info(f'开始删除拷贝项目中含有{extensions}结尾的文件 [target_dir]:{target_dir}\n')
    # delete_specific_files(target_dir, extensions, exclude_file_list)
    # logger.info(f'结束删除拷贝项目中含有{extensions}结尾的文件 [target_dir]:{target_dir}\n')

    # 4.编译项目['.c']文件 -> ['.so', 'pyd']
    compile_extensions = ['.c']
    logger.info(f"开始编译项目{compile_extensions}文件 ->  ['.so', 'pyd']\n")
    compile_c_files(target_dir, compile_extensions, exclude_folders, exclude_file_list)
    logger.info(f"结束编译项目{compile_extensions}文件 ->  ['.so', 'pyd']\n")

    logger.info(f'项目编译处理完成,源码文件路劲:{source_dir}\n')
    logger.info(f'项目编译处理完成,编译打包文件路劲:{target_dir}\n')


if __name__ == '__main__':
    main()

3.清理编译后的项目文件

创建clean_compile_file.py文件

# -*- coding: utf-8 -*-
import logging

import os

from concurrent.futures import ThreadPoolExecutor

executor = ThreadPoolExecutor(max_workers=50)

# ============================== 配置日志 ===============================
# 定义日志文件的名称
log_filename = 'setup_compile_file.log'

# 创建一个日志记录器
logger = logging.getLogger()
logger.setLevel(logging.INFO)  # 设置日志级别为 INFO

# 创建一个文件处理器,并设置级别为 INFO
file_handler = logging.FileHandler(log_filename, encoding='utf-8')  # 指定编码为 utf-8
file_handler.setLevel(logging.INFO)

# 创建一个流处理器(控制台输出),并设置级别为 INFO
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO)

# 创建日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)

# 将处理器添加到日志记录器
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
# ============================== 配置日志 ===============================


# BASE_DIR = os.getcwd()
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 设置 BASE_DIR
logger.info(f"BASE_DIR -> {BASE_DIR}\n")


def delete_specific_files(folder, extensions, exclude_file_list):
    """
    在指定文件夹中删除所有以extensions中指定的扩展名结尾的文件。

    :param folder: 文件夹路径
    :param extensions: 要删除的文件扩展名列表
    """
    # 遍历文件夹
    logger.info(f"")
    ans = 0
    for root, dirs, files in os.walk(folder):
        for file in files:
            if file in exclude_file_list:
                logger.info(f"不删除文件:[{file}] 在 exclude_file_list:{exclude_file_list} 中!")
                continue
            if file.endswith(tuple(extensions)):
                os.remove(os.path.join(root, file))
                logger.info(f"已删除含有 {extensions} 的文件: {os.path.join(root, file)}")
                ans += 1
    logger.info(f"已删除以{extensions}结尾的文件数量:{ans}")


def main():
    exclude_folders = ['tests', '.git', '.idea', '__pycache__', 'a-deploy', 'deploy']
    exclude_file_list = ['app.py', 'app.c']
    logger.info(f'========= 项目编译文件清理完成开始 ========\n')
    target_dir = os.path.join(BASE_DIR, 'deploy', 'dist')

    # 删除py文件
    extensions = ['.py', '.o', '.pyd', '.c']
    logger.info(f'开始删除拷贝项目中含有{extensions}结尾的文件 [target_dir]:{target_dir}\n')
    delete_specific_files(target_dir, extensions, exclude_file_list)
    logger.info(f'结束删除拷贝项目中含有{extensions}结尾的文件 [target_dir]:{target_dir}\n')

    # # 删除源码下的['.so', 'pyd', '.c']文件
    # src_extensions = ['.so', 'pyd', '.c']
    # logger.info(f"开始删除源码下的{src_extensions}文件\n")
    # delete_specific_files(source_dir, src_extensions)
    # logger.info(f"结束删除源码下的{src_extensions}文件\n")

    logger.info(f'========= 项目编译文件清理完成!=========\n')


if __name__ == '__main__':
    main()

其他操作

清理源代码下的.c文件(可选)
clean_code_c_file.py

# -*- coding: utf-8 -*-
import logging

import os

from concurrent.futures import ThreadPoolExecutor

executor = ThreadPoolExecutor(max_workers=50)

# ============================== 配置日志 ===============================
# 定义日志文件的名称
log_filename = 'setup_compile_file.log'

# 创建一个日志记录器
logger = logging.getLogger()
logger.setLevel(logging.INFO)  # 设置日志级别为 INFO

# 创建一个文件处理器,并设置级别为 INFO
file_handler = logging.FileHandler(log_filename, encoding='utf-8')  # 指定编码为 utf-8
file_handler.setLevel(logging.INFO)

# 创建一个流处理器(控制台输出),并设置级别为 INFO
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO)

# 创建日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)

# 将处理器添加到日志记录器
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
# ============================== 配置日志 ===============================


# BASE_DIR = os.getcwd()
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 设置 BASE_DIR
logger.info(f"BASE_DIR -> {BASE_DIR}\n")


def delete_specific_files(folder, extensions, exclude_file_list):
    """
    在指定文件夹中删除所有以extensions中指定的扩展名结尾的文件。

    :param folder: 文件夹路径
    :param extensions: 要删除的文件扩展名列表
    """
    # 遍历文件夹
    logger.info(f"")
    ans = 0
    for root, dirs, files in os.walk(folder):
        for file in files:
            if file in exclude_file_list:
                logger.info(f"不删除文件:[{file}] 在 exclude_file_list:{exclude_file_list} 中!")
                continue
            if file.endswith(tuple(extensions)):
                os.remove(os.path.join(root, file))
                logger.info(f"已删除含有 {extensions} 的文件: {os.path.join(root, file)}")
                ans += 1
    logger.info(f"已删除以{extensions}结尾的文件数量:{ans}")


def main():
    exclude_folders = ['tests', '.git', '.idea', '__pycache__', 'a-deploy', 'deploy']
    exclude_file_list = ['app.py', 'app.c']
    logger.info(f'========= 项目编译文件清理完成开始 ========\n')
    source_dir = BASE_DIR

    # 删除源码下的['.so', 'pyd', '.c']文件
    src_extensions = ['.c']
    logger.info(f"开始删除源码下的{src_extensions}文件\n")
    delete_specific_files(source_dir, src_extensions, exclude_file_list)
    logger.info(f"结束删除源码下的{src_extensions}文件\n")

    logger.info(f'========= 项目源码文件清理完成!=========\n')


if __name__ == '__main__':
    main()

shell脚本

start_setup.sh

#!/bin/bash

echo "开始执行 setup_cmd.py ..."
python3 setup_cmd.py
echo "setup_cmd.py 执行完成!"

echo "开始执行 setup_compile_file.py ..."
python3 setup_compile_file.py
if [ $? -eq 0 ]; then
    echo "setup_compile_file.py 中的所有任务执行成功完成!"
else
    echo "setup_compile_file.py 执行失败或任务未完成,请检查错误。"
    exit 1
fi

# 等待 setup_compile_file.py 中的所有线程完成后,执行 clean_compile_file.py
echo "开始执行 clean_compile_file.py ..."
python3 clean_compile_file.py
if [ $? -eq 0 ]; then
    echo "clean_compile_file.py 执行成功!"
else
    echo "clean_compile_file.py 执行失败,请检查错误。"
    exit 1
fi

echo "所有脚本执行完毕。"

Cython只是帮助我们将Python代码(或Python风格的代码)转换成了C代码,然后编译成了二进制形式。这个过程并不是传统意义上的“编译Python代码为机器码执行”,而是利用了C的编译效率和Python的易用性之间的平衡。

本文介绍到此结束,希望对你有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2165711.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos7.9在K8s安装生产级别的分布式存储Rook+Ceph

1.介绍 在k8s云原生平台中,存储是除了网络之外的另一个核心,因为他涉及到了数据的保存,以及容灾等一系列的问题,做生产级别的应用,一定要具有多节点分布式,灾备及时恢复,数据平滑迁移等多种特性…

WDM站点类型 -- 波分站点类型

OTM OTM: Optical Terminal Multiplerer 光终端复用站 OTM站点将业务信号通过合波单元插入到波分系统的线路上去,同时可将业务经过分波 单元从波分系统的线路上分下来。 OLA OLA: Optical Line Amplifier 光线路放大设备 OLA站点用来完成双向传输信号的放大&#xf…

【Python】Windows下安装使用FFmpeg

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。之前为了MP3转wav,需要pip安装并import AudioSegment,但是会报错:FileNotFoundError: [WinError 2] 系统找不到指定的文件。 因为FFmpeg需要另…

怎么利用PHP发送彩信

在数字化时代,信息传播的速度与效率成为了企业营销、客户服务及日常沟通中不可或缺的关键因素。随着移动通信技术的飞速发展,群发彩信作为一种集文字、图片、声音于一体的多媒体信息服务方式,正逐渐展现出其独特的优势,成为众多行…

MySQL InnoDB undo log数据结构分析

一、概念解析 1、undo log基本 undo log是InnoDB事务中特有的结构,它的作用有两个:一是进行事务回滚(原子性),旧数据先放到undo log中,等rollback时再将旧数据里的数据回滚回来;二是MVCC&…

UE5 Windows热更新解决方案思路(HotPatcher+Tomcat+RuntimeFilesDownloader)

以下个人学习笔记。其中必会存在一些问题,仅作参考。本人版本5.1。 参考视频: UE4热更新:HotPatcher插件使用教程_哔哩哔哩_bilibili 3.检查需要下载的版本_哔哩哔哩_bilibili 参考文章: UE 热更新:Questions &…

【js逆向学习】qqmusic(qq音乐)webpack智能导出

文章目录 逆向目标逆向分析逆向过程逆向总结 逆向目标 网址:https://y.qq.com/n/ryqq/album/3接口:https://u6.y.qq.com/cgi-bin/musics.fcg参数:sign 逆向分析 这里主要分析 新碟 类别下的接口,直接 Copy as cURL 转为 reques…

文件上传漏洞+CTF实例

解题思路 前端绕过 手动修改前端js代码进行绕过:右击-查看页面源代码-ctff进行位置定位-修改JavaScript函数 后端绕过 文件类型绕过(Content-Type) 常见MIME类型描述application/octet-stream 表示所有其他情况的默认值 text/plain表示文…

从HarmonyOS Next导出手机照片

1)打开DevEco Studio开发工具 2)插入USB数据线,连接手机 3)在DevEco Studio开发工具,通过View -> Tool Windows -> Device File Browser打开管理工具 4)选择storage -> cloud -> 100->fi…

在二维平面中,利用时差定位(TDOA)技术,结合N个锚点,通过三边法进行精确定位,采用MATLAB实现

文章目录 主程序程序代码运行结果 主程序 主程序代码如下: % TDOA测距定位,二维平面, 4个锚节点的情况 % author:Evand(VX:matlabfilter,除前期达成一致外,讲解需付费) % 2024年9月…

C语言扫盲

文章目录 C版本C语言特征GCCprintf数据类型函数指针内存管理void指针 Struct结构和Union结构typedef预处理器make工具cmake工具Projectintegral of sinc functionemulator embedded systeman event schedule 补充在线Linux终端参考 建议还是国外教材学习…人家的PPT比国内的好太…

RockTrack:A 3D Robust Multi-Camera-Ken Multi-Object Tracking Framework

RockTrack: A 3D Robust Multi-Camera-Ken Multi-Object Tracking Framework 基础信息 单位:哈尔滨理工大学论文:https://arxiv.org/pdf/2409.11749代码:https://github.com/lixiaoyu2000/Rock-Track (未全部放出)数据集:nuScen…

基于C++(FLTK)实现(CS界面)超市收银系统

超市收银系统 Supermarket POS system 本次大作业是利用 C语言,基于 FLTK 图形库来设计超市收银系统。首先介绍程序的设计思想: 这套程序完全是基于题目所给的要求逐条逐步设计的。我把程序实现大致分为数据层面和图形层面。 数据层面: 程…

神经网络(五):U2Net模型

文章目录 一、网络结构1.1第一种block结构1.2第二种block结构1.3特征图融合1.4损失函数1.5总体网络架构1.6代码汇总1.7普通残差块与RSU对比 二、代码复现 参考论文:U2-Net: Going deeper with nested U-structure for salient object detection   这篇文章基于显著…

钢管加工长度检测系统源码分享

钢管加工长度检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

笔试编程-百战成神——Day01

1.数字统计 题目来源:数字统计——牛客网 测试用例 算法原理 根据题目我们知道,首先要输出两个数字确定一个区间,寻找这个区间内数字中所有包含2的个数,比如12包含一个2,22包含两个2,以此类推,所以我们的…

问题记录:end value has mixed support, consider using flex-end instead

一、问题记录 二、解决问题 根据提示改为flex-end 三、理解问题 ‌这个警告信息表明,在Flex布局中使用“end”属性时存在兼容性问题,建议使用“flex-end”代替。 当在Flex布局中使用“justify-content: end;”时,浏览器可能对“end”值的支…

嵌入式C语言的自我修养:内存泄漏与防范

内存泄漏与防范 一个内存泄漏的例子 如果我们使用malloc()申请的内存在使用结束后没有及时被释放&#xff0c;则C标准库中的内存分配器ptmalloc和内核中的内存管理子系统都失去了对这块内存的追踪和管理。 #include <stdlib.h> int main(void){ char *p; p(char *)mal…

plt常用函数介绍一

目录 前言plt.figure()plt.subplot()plt.subplots()plt.xticks()plt.xlim() 前言 Matplotlib是Python中的一个库&#xff0c;它是数字的-NumPy库的数学扩展。 Pyplot是Matplotlib模块的基于状态的接口。在Pyplot中可以使用各种图&#xff0c;例如线图&#xff0c;轮廓图&#…

C++独立开发开源大数计算库 CBigNum

项目简介&项目地址 CBigNum 是本人独立开发开源的一款大数计算库&#xff0c;支持任意位数整数带任意位数小数的浮点运算。您可以通过本库执行非常大的数据运算或非常高精度的除法运算(您可以随意指定除法的小数保留到第几位)以及各种科学计算(详见1.3)。 项目地址&#…