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 .
