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 .

相关推荐
李永奉几秒前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑
小柯南敲键盘4 分钟前
跨马翻译:AI批量图片翻译工具,跨境电商视频字幕翻译与智能抠图一体搞定
人工智能·python·音视频
2601_9622972515 分钟前
Python里behave和pytest-bdd哪个更适合中大型项目?为什么?
python·bdd·行为驱动开发·behave·pytest-bdd
秦老师Q1 小时前
php零基础入门到实战,从语法到框架,一篇搞定
开发语言·php
驭渊的小故事1 小时前
多线程02
java·开发语言·jvm
阿里嘎多学长1 小时前
2026-09-09 GitHub 热点项目精选
开发语言·程序员·github·代码托管
君顾12 小时前
本地折扣卡 CPS 平台搭建:从系统架构到落地实战
java·开发语言·折扣卡
YCOSA20252 小时前
系统工具使用检测.exe (仅供娱乐)
python·microsoft
2601_962295332 小时前
如何python实现网页的自动化
python·selenium·beautifulsoup·requests·网页自动化
ofoxcoding3 小时前
GPT Image 2.5 API 实战:Python 调用实现图片生成与编辑
人工智能·python·gpt·ai