Python项目一键创建

Python项目一键创建

本地进行代码开发的时候,我需要快速进行Python项目管理->【UV环境管理】+【Git项目管理】+【绝对路径导入】+【src工作目录配置】+【pytest测试管理】,当前编写了一个脚本可以快速的把这些内容串起来,后期可以结合LLM进行SKILL提炼,基于我常用的编码规范快速进行项目开发

文章目录


1-执行脚本

bash 复制代码
#!/bin/bash

# ==========================================
# Python Src-Layout Project Generator (UV Native)
# ==========================================

# 1. 参数校验
if [ -z "$1" ]; then
    echo "❌ 错误:请提供项目名称。"
    echo "用法: ./create_uv_project.sh <project_name>"
    exit 1
fi

PROJECT_NAME=$1
PACKAGE_NAME=$PROJECT_NAME
PYTHON_VERSION="3.11.4" # 默认版本,可在此修改

echo "🚀 开始创建项目: $PROJECT_NAME (使用 UV 初始化)"

# 2. 创建项目根目录并进入
mkdir -p "$PROJECT_NAME"
cd "$PROJECT_NAME" || exit

# 3. 指定 Python 版本 (核心变更)
echo "🐍 正在固定 Python 版本为 $PYTHON_VERSION..."
uv python pin "$PYTHON_VERSION"

# 4. 使用 UV 初始化项目 (核心变更)
# --lib: 创建 src 布局 (src/<name>/__init__.py)
# --name: 指定包名
# .: 在当前目录初始化
echo "⚙️  正在执行 uv init..."
uv init --lib --name "$PACKAGE_NAME" .

# 5. 同步环境并安装 pytest (核心变更)
# uv init 生成的 pyproject.toml 默认没有 pytest
# 使用 uv add 自动添加依赖并安装,比手动编辑 toml 更优雅
echo "📦 正在添加开发依赖..."
uv add --dev pytest

# 6. 创建自定义代码结构
# uv init 已经创建了 src/$PACKAGE_NAME/__init__.py
# 我们只需要创建子模块目录
# 显式创建 tests 目录,防止 uv init 未创建导致报错
echo "📂 正在生成业务代码结构..."
mkdir -p tests
mkdir -p "src/$PACKAGE_NAME/pfruit"
mkdir -p "src/$PACKAGE_NAME/utils"
# 删除自动生成的 py.typed 标记文件
rm -f "src/$PACKAGE_NAME/py.typed"


# 7. 生成代码文件
# 覆盖根目录的 __init__.py,移除 hello() 样板代码 ---
cat <<EOF > "src/$PACKAGE_NAME/__init__.py"
# 此文件将 $PACKAGE_NAME 标记为一个 Python 包
EOF

cat <<EOF > "src/$PACKAGE_NAME/pfruit/__init__.py"
# 使用绝对路径导入底层模块
from $PACKAGE_NAME.pfruit.fruit import UnknownFruitError, Fruit

# 注册所有可用的水果类型
# 注意:__all__ 必须是字符串列表
__all__ = [
    "UnknownFruitError",
    "Fruit",
]
EOF

# src/myproject/pfruit/fruit.py
cat <<EOF > "src/$PACKAGE_NAME/pfruit/fruit.py"
"""水果模块:定义水果类和异常"""

class UnknownFruitError(Exception):
    """当遇到未知水果时抛出"""
    pass

class Fruit:
    def __init__(self, name: str):
        self.name = name

    def get_info(self) -> str:
        return f"This is a {self.name}."
EOF

# src/myproject/utils/helpers.py
cat <<EOF > "src/$PACKAGE_NAME/utils/helpers.py"
"""工具函数"""
def get_greeting(name: str) -> str:
    return f"Hello, {name}!"
EOF

# src/myproject/main.py
cat <<EOF > "src/$PACKAGE_NAME/main.py"
"""主程序运行"""
from $PACKAGE_NAME.pfruit import Fruit, UnknownFruitError

if __name__ == '__main__':
    apple = Fruit("Apple")
    print(f"\n-------主程序运行测试:{apple.name}->{apple.get_info()}")
EOF

# tests/test_fruit.py
cat <<EOF > tests/test_fruit.py
"""测试水果模块"""
# 测试绝对导入
# 方式1:直接从包层级导入 (验证 __init__.py 的暴露)
from $PACKAGE_NAME.pfruit import Fruit, UnknownFruitError

# 方式2:从具体模块导入 (依然有效)
# from $PACKAGE_NAME.pfruit.fruit import Fruit

def test_fruit_creation():
    apple = Fruit("Apple")
    assert apple.name == "Apple"
    assert apple.get_info() == "This is a Apple."

def test_exception_exists():
    assert UnknownFruitError is not None
EOF


# 8. 最终同步
echo "🔄 最终同步环境..."
uv sync

# 9. Git 初始化与提交 (新增步骤)
echo "🔨 初始化 Git 仓库..."
git init
git add .
# 注意:如果未配置 git user.name/email,commit 可能会失败
git commit -m "init project"

# 10. 输出结果
echo "✅ 项目创建完成!"
echo ""
echo "--------------------------------"
echo "📂 项目结构概览:"
echo "."
echo "├── .git/                (Git 仓库)"
echo "├── .gitignore"
echo "├── .python-version      (Pinned: $PYTHON_VERSION)"
echo "├── pyproject.toml"
echo "├── uv.lock"
echo "├── README.md"
echo "├── src/"
echo "│   └── $PACKAGE_NAME/"
echo "│       ├── __init__.py"
echo "│       ├── pfruit/"
echo "│       │   ├── __init__.py"
echo "│       │   └── fruit.py"
echo "│       └── utils/"
echo "│           └── helpers.py"
echo "└── tests/"
echo "    └── test_fruit.py"
echo "--------------------------------"
echo "👉 接下来请运行: cd $PROJECT_NAME && code ."

2-运行结果

bash 复制代码
20260316_2_PythonInit % chmod 777 create_uv_project.sh 
20260316_2_PythonInit % ./create_uv_project.sh uv_python_init
🚀 开始创建项目: uv_python_init (使用 UV 初始化)
🐍 正在固定 Python 版本为 3.11.4...
Pinned `.python-version` to `3.11.4`
⚙️  正在执行 uv init...
Initialized project `uv-python-init` at `/Users/a888/TT_Workspace/Pycharm/20260316_2_PythonInit/uv_python_init`
📦 正在添加开发依赖...
warning: Indexes specified via `--index-url` will not be persisted to the `pyproject.toml` file; use `--default-index` instead.
Using CPython 3.11.4
Creating virtual environment at: .venv
Resolved 7 packages in 19ms
      Built uv-python-init @ file:///Users/a888/TT_Workspace/Pycharm/20260316_2_PythonInit/uv_python_init
Prepared 1 package in 7ms
Installed 6 packages in 6ms
 + iniconfig==2.3.0
 + packaging==26.0
 + pluggy==1.6.0
 + pygments==2.19.2
 + pytest==9.0.2
 + uv-python-init==0.1.0 (from file:///Users/a888/TT_Workspace/Pycharm/20260316_2_PythonInit/uv_python_init)
📂 正在生成业务代码结构...
🔄 最终同步环境...
Resolved 7 packages in 1ms
Audited 6 packages in 1ms
🔨 初始化 Git 仓库...
在 /Users/a888/TT_Workspace/Pycharm/20260316_2_PythonInit/uv_python_init/.git/ 重新初始化已存在的 Git 仓库
[master(根提交) 47da41b] init project
 11 files changed, 155 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 .python-version
 create mode 100644 README.md
 create mode 100644 pyproject.toml
 create mode 100644 src/uv_python_init/__init__.py
 create mode 100644 src/uv_python_init/main.py
 create mode 100644 src/uv_python_init/pfruit/__init__.py
 create mode 100644 src/uv_python_init/pfruit/fruit.py
 create mode 100644 src/uv_python_init/utils/helpers.py
 create mode 100644 tests/test_fruit.py
 create mode 100644 uv.lock
✅ 项目创建完成!

--------------------------------
📂 项目结构概览:
.
├── .git/                (Git 仓库)
├── .gitignore
├── .python-version      (Pinned: 3.11.4)
├── pyproject.toml
├── uv.lock
├── README.md
├── src/
│   └── uv_python_init/
│       ├── __init__.py
│       ├── pfruit/
│       │   ├── __init__.py
│       │   └── fruit.py
│       └── utils/
│           └── helpers.py
└── tests/
    └── test_fruit.py
--------------------------------
👉 接下来请运行: cd uv_python_init && code .

相关推荐
panzer_maus2 小时前
死锁的产生与解决
java·开发语言
阿贾克斯的黎明2 小时前
Drogon 框架完全指南:C++ 后端开发的新选择
开发语言·c++
郝学胜-神的一滴2 小时前
C++备忘录模式:优雅实现对象状态保存与恢复
开发语言·c++·程序人生·备忘录模式
小年糕是糕手2 小时前
【C++】string类(三)
开发语言·数据结构·c++·程序人生·算法
星河耀银海2 小时前
C++ 继承:面向对象的代码复用核心机制
开发语言·c++
纤纡.2 小时前
Python 实战:基于朴素贝叶斯的苏宁易购评价情感分析
开发语言·python·机器学习
前端付豪2 小时前
AI Tutor v5:自动出卷系统
前端·python·llm
西装没钱买2 小时前
C语言组播的使用
c语言·开发语言·udp·组播·组播绑定网卡
胖祥2 小时前
onnx之NodeComputeInfo
开发语言·c++·算法