Python连接云端Linux服务器进行远程 (后端开发/深度学习)时候的注意事项

ooooop——❤️

插件:code runner , DataBase Client code-style
还有特定语言的 去 特定的 快速开始——插件网站
修改:rules , comate设置
下载依赖,跑通代码,可以不用跑通,可以先看懂!如果没时间的话 ——> 询问Zulu,实际讲解一个例子,看懂主要涉及到的文件——> 注释加上之后,git commit——> 分解需求为n个阶段,思考详细完整的prompt,询问Ducc

自己思考的原则:
不必要的换行 不需要,还增加token
阶段划分,详细prompt
更新逻辑:1️⃣ 2️⃣ 3️⃣ … 就像解释黑马到课程流程图一样,需要自己脑子里面想好流程图,然后详细描述给
指令结合代码,指出引用的函数,就像你自己思考写入代码的过程
把自己能写出来的 代码写出来,比如查询条件
及时保存!!再去问ducc ,每次改完之后对比!,问ducc中途别动代码

Prompt 附上:
附上已有的控制台的输出
要求不要删除已有的函数定义,可以增加函数定义
要求每一个步骤完成,需要打印控制台日志,并做好分割线到处理,以便清晰可见
要求做好 鲁棒性的处理,如果没有查询到正确的数据,需要打印 出详细的原因
要求循序渐进的处理,先完成第一阶段的内容,然后停止,我自己去检查,之后还会再次找您完成后续阶段的任务,以及补充更多的内容,谢谢您


查看当前IP

在这里插入图片描述

Linux 和 shell

项目结构——❤️

在这里插入图片描述

查看系统发行版本

cat /etc/os-release

在这里插入图片描述

🌲 思维导图:Linux 知识体系(以“Linux”为根节点)

                                     Linux
                                       |
       --------------------------------------------------------
       |                            |                          |
    内核 (Kernel)             发行版 (Distribution)     工具与生态
       |                            |                          |
   麒麟、Linus、...         商业发行版        社区发行版
       |                      |           |            |
   核心功能:               RHEL        Debian      Ubuntu
   - 进程管理               Fedora      CentOS      Arch
   - 内存管理               SUSE        Mint        openSUSE
   - 文件系统管理
   - 网络栈
   - 设备驱动

       |                    |           |            |
       |                    |           |            |
       |                Red Hat    Canonical   Debian
       |                     |           |            |
       |                 (商业)      (社区)      (社区)
       |                                    
       |
       |
       v
    常用工具与命令
       |
   -------------------------------
   |             |             |
   命令行工具   文件系统      用户与权限
   |             |             |
   - ls, cd, pwd  - mount     - useradd
   - ps, kill     - tar, gzip  - sudo
   - grep, awk    - cp, mv     - chmod
   - find, which  - df, du     - chgrp
   - vim          - ln, touch  - su
   - scp          - fdisk      - usermod
   - ssh          - blkid      - groupadd
   - top, htop    - mkfs       - passwd
                                  - id
                                  - whoami
                                  
       |
       v
    脚本与自动化
       |
   ----------------------
   |                  |
   Shell Script    Python (for automation)
   |                  |
   - if/else          - requests
   - for loops        - subprocess
   - functions        - paramiko
   - arguments        - cron jobs
   - pipes & redirects

✅ 1. linux 常见的各种版本

Linux的发行版本可以大体分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行版本,前者以著名的Red Hat(RHEL红帽)为代表,后者以Debian为代表

“Linux 通常指代 Linux 内核;而我们在日常中使用的‘Linux 系统’其实是基于该内核的 发行版(Distribution)。发行版分为:

  • 商业发行版:如 Red Hat Enterprise Linux (RHEL),由 Red Hat 公司提供,用于企业环境。
  • 社区发行版:如 Debian、Ubuntu、openSUSE、Arch Linux 等,由开源社区维护。

注意:Fedora 是 Red Hat 提供的 免费、前沿的社区项目,它也是 RHEL 的技术试验田
而 CentOS 原本是 RHEL 的免费克隆版本,但如今已被 CentOS Stream 取代,成为 RHEL 的滚动预览版本

补充说明:
发行版 类型 公司 特点
RHEL 商业 Red Hat 稳定、付费、安全支持好
Fedora 社区 Red Hat 最新特性、开发人员友好
CentOS 社区 Red Hat 旧版是 RHEL 的免费镜像,现在是 CentOS Stream(滚动更新)
Debian 社区 自由组织 很稳定,适合服务器,依赖关系强
Ubuntu 社区 Canonical 用户友好,桌面体验佳,广泛用于云平台
openSUSE 社区 SUSE 功能丰富,YaST 图形管理工具强大
Arch Linux 社区 无公司 极简主义,滚动更新,适合高级用户

✅ 2. root 用户以及 sudo 命令

  • “superuser do”:允许普通用户临时获得 root 权限
  • 不需要切换为 root,而是通过密码验证后执行特定命令
sudo command

例如:

sudo apt update          # 更新系统
sudo systemctl restart nginx   # 重启服务
  1. 用户必须在 sudoers 文件中被授权(默认大多数用户不在)
  2. 第一次输入时会提示输入自己的密码(不是 root 密码)
  3. 成功后可以运行带 sudo 的命令
susudo 的区别:
命令 作用 权限 是否需要密码
su 切换到另一个用户(通常是 root) 全部权限 需要 root 密码
sudo 以 root 身份运行某个命令 仅运行命令时生效 需要用户自己的密码

✅ 推荐使用 sudo,因为它更安全!

✅ 3. 用户和用户组的区别,怎么和 root 切换?

查看当前用户和用户组
whoami
# 输出:root 或 yourusername
  • 🔹 查看当前用户的所属组
groups
# 输出:yourusername docker users wheel
  • 🔹 添加用户到组
sudo usermod -aG docker username

-aG:追加(append)到组,不覆盖原有组

切换用户
  • su userName:切换到指定用户
  • su -:切换到 root(带环境变量)
  • 🔹 切换为 root
su -          # 需要 root 密码
# 或者推荐:
sudo su -     # 需要当前用户的密码

✅ 4. Linux 的进程管理

ps: 查看进程列表

ps -aux和ps -ef命令参数的作用及区别详解
第二列都是PID

ps aux              # 显示所有用户的所有进程
ps -ef              # 传统格式,显示完整信息
参数 含义
a 显示所有终端的进程
u 显示用户信息
x 显示没有控制终端的进程
-e 显示所有进程
-f format, 格式化的形式展现 信息
kill: 终止进程
kill 1234          # 终止 PID 为 1234 的进程
kill -9 1234       # 强制终止(发送 SIGKILL)

💡 如果找不到进程,先用 ps -ef | grep process_name 查找

wait 命令
  • 用来等待子进程完成
  • 一般用于脚本中,避免父进程提前退出

示例:

#!/bin/bash
echo "Starting background task..."
sleep 5 &
PID=$!
echo "Background task started with PID $PID"

wait $PID
echo "Task finished!"

🔍 注意:wait 不是常见命令,多用于 shell 脚本。


✅ 5. 文件系统与挂载:mount / unmount

什么是挂载(Mount)?
  • 将一个存储设备(如硬盘、U盘、分区)连接到系统的目录树中
  • 使得你可以像访问普通文件一样读写它
  • 操作系统不能直接读取物理磁盘,必须通过“挂载点”才能访问
  • 类比:USB 插入电脑,系统自动挂载到 /media/user/usb否则只能看到原始数据块
挂载 vs 解压(tar / unzip)
对比项 挂载(mount) 解压(tar/unzip)
数据来源 硬盘、U盘、网络 压缩文件(.zip/.tar.gz)
操作方式 创建挂载点,绑定设备 解压到目录
是否持久 是(重启后仍有效) 否(需重新解压)
文件结构 保持真实结构 重建文件结构
用途 访问真实磁盘数据 备份/部署代码
常用命令——❤️

假设你有一个硬盘 /dev/vda1,你想把它挂载到 /home/work

# 1. 创建挂载目录
mkdir -p /home/work

# 2. 挂载
mount -t ext4 /dev/vda1 /home/work

# 3. 查看是否成功
df -h
# 输出:/dev/vda1  10G   1G   9G  10% /home/work

# 4. 现在可以正常访问
ls /home/work
  • -p:递归创建目录,即如果父目录不存在,先创建父目录,再创建子目录
  • 💡 mkdir -p 是最常用的安全做法!
  • -t ext4指定文件系统类型为 ext4,这是一种常见的 Linux 文件系统
    • ⚠️ 注意:如果你不确定文件系统类型,可以用:blkid /dev/vda1 会显示类似:/dev/vda1: TYPE="ext4"
  • /dev/vda1:设备或分区的路径。/dev/vda 通常是第一块硬盘,1 表示第一个分区
  • /home/work:挂载点,即设备挂载到这个目录下,用户可以通过这个目录访问设备中的文件
  • Linux df(英文全拼:display free disk space) 命令用于用于显示文件系统的磁盘空间使用情况,包括总容量、已用空间、可用空间和挂载点等信息
  • -h 选项会以人类可读的方式显示磁盘空间使用情况
卸载(unmount)
umount /home/work

⚠️ 注意:如果还在使用该目录(如进入其中),无法卸载


✅ 6. 解压与压缩命令

工具 用途 命令示例
tar 打包多个文件 tar -cvf archive.tar files/
gzip 压缩成 .gz gzip file.txt
bzip2 更高压缩率 bzip2 file.txt
xz 极高压缩率 xz file.txt
常见组合命令:
# 打包并压缩为 .tar.gz
tar -czvf archive.tar.gz folder/

# 解压 .tar.gz
tar -xzvf archive.tar.gz

# 解压 .zip
unzip file.zip

# 压缩单个文件
gzip file.txt

# 解压 .gz
gunzip file.txt.gz
  • -c:创建归档
  • -x:解压归档
  • -z:使用 gzip 压缩
  • -j:使用 bzip2
  • -v:显示过程
  • -f:指定文件名

✅ 7. export 命令是什么?

  • 设置 环境变量,让程序知道某些路径或配置
export HTTP_PROXY="http://agent.baidu.com:8891"
  • 意思是:告诉系统,在进行网络请求时,使用代理服务器 http://agent.baidu.com:8891
  • 在公司内网,访问外网必须经过代理
  • 让所有网络访问的命令(如 wget, apt, curl)都走代理
  • 验证是否生效:echo $HTTP_PROXY
永久设置:

export 放进 shell 配置文件中(如 ~/.bashrc

echo 'export HTTP_PROXY="http://agent.baidu.com:8891"' >> ~/.bashrc
source ~/.bashrc
  • 临时:只当前终端有效
  • 永久:加到 ~/.bashrc,下次登录自动加载
常见环境变量:
变量 作用
PATH 搜索可执行文件的路径
HOME 用户主目录
LANG 语言设置
HTTP_PROXY 代理设置
JAVA_HOME Java 安装路径

常用shell命令——❤️

cat /etc/shells  # 可用的shell有哪些
echo $HOME   # 家的位置
echo $PATH   # 环境变量
echo $SHELL  # 当前用的版本
echo $0      # 当前脚本名称
who am i
which pyhton
where pyton
pwd
date
ls -al

vi hello.sh

在Windows上使用Shell

在Windows上使用Shell,主要有Windows自带的PowerShell、命令提示符 (CMD),以及通过安装Git BashWSL ( Windows Subsystem for Linux ) 获得更完整的Linux Bash环境
推荐使用现代的Windows终端 (Windows Terminal) 来统一管理它们

1. 使用Windows自带工具

  • PowerShell (推荐的Windows Shell):
    • 在开始菜单搜索 “PowerShell” 或 “Windows PowerShell” 并打开。
      它功能强大,支持跨平台,是Windows的现代化命令行工具。
      命令提示符 (CMD):
    • 在开始菜单搜索 “cmd” 或 “命令提示符” 并打开。

2. 使用Git Bash (类Unix Shell环境)

  • 安装: 下载并安装Git for Windows (包含Git Bash)。
  • 使用:
    • 安装后,在任意文件夹下右键点击,选择 “Git Bash Here” 即可打开一个 Bash 终端。
    • 可以使用 ls, cd, pwd 等标准Shell命令。
    • 运行Shell脚本(.sh文件)时,使用 ./test.sh 或 sh test.sh。

3. 使用WSL (Windows Subsystem for Linux)

  • 功能: 让你在Windows上运行一个真实的Linux发行版 (如Ubuntu) 的命令行环境。
  • 使用:
    • 需要先在Windows设置中启用WSL。
    • 安装喜欢的Linux发行版 (从Microsoft Store)。
    • 打开WSL终端,即可使用 apt, bash, grep等原生Linux命令。

4. 使用Windows终端 (统一管理)

  • 功能: 现代化的多标签页终端应用,可以同时运行PowerShell, CMD, Git Bash, WSL等。
  • 使用:
    • 从Microsoft Store下载安装 Windows Terminal。
    • 在设置中可以配置默认配置文件,添加你的Git Bash或WSL

which和whereis区别

which 查找可执行的命令(在 $PATH 中找到的可运行程序),
whereis 查找二进制文件、源代码和帮助文档(但不检查路径,只查标准位置)。

📊 一、详细对比表

特性 which whereis
作用 查找某命令是否在 $PATH,并返回其完整路径 查找程序相关的文件(二进制、源码、手册页等)
查找范围 只在环境变量 $PATH 中搜索 在预定义的标准目录中搜索(如 /bin, /usr/bin, /usr/local/bin, /usr/share/man 等)
是否能运行? ✅ 能运行(如果存在) ❌ 不判断能否运行,只是列出可能的位置
输出内容 单个路径(通常是可执行文件) 多个路径:二进制、源码、手册页
是否支持别名? ✅ 支持(会显示别名对应的路径) ❌ 不支持(只找真实文件)
适用场景 检查命令是否存在并获取执行路径 查看某个命令有哪些配套文件(特别是开发用途)

✅ 实际例子演示

示例 1:用 which 查找 python
$ which python
/usr/bin/python3

👉 表示在 $PATH 中找到了 python 命令,路径是 /usr/bin/python3

示例 2:用 whereis 查找 python
$ whereis python
python: /usr/bin/python3 /usr/lib/python3 /usr/share/man/man1/python.1.gz

👉 输出了三个部分:

  • 二进制文件/usr/bin/python3
  • 库文件/源码/usr/lib/python3
  • 手册页/usr/share/man/man1/python.1.gz

💡 注意:whereis 不检查 PATH,它只在系统默认的“常见位置”搜索。


🧩 二、使用场景详解

which 的典型用途:
  1. 检查某个命令是否可用:

    $ which ls
    /bin/ls
    

    → 如果返回路径,则说明 ls 存在;否则不存在。

  2. 查看当前使用的命令版本(比如区分 python 是哪个解释器):

    $ which python
    /home/user/.pyenv/shims/python
    

    → 显示你当前激活的 Python 是通过 pyenv 安装的。

  3. 判断是否有冲突的命令(多个同名命令):

    $ which python
    /usr/bin/python
    /home/user/.local/bin/python
    

⚠️ 注意:which 是 shell 内建命令(type 更准确),但大多数情况够用。


whereis 的典型用途:
  1. 查找一个命令的完整信息(尤其是开发人员):

    $ whereis gcc
    gcc: /usr/bin/gcc /usr/lib/gcc /usr/share/man/man1/gcc.1.gz
    

    → 可以看到编译器、库文件和手册页。

  2. 检查是否安装了某个软件包的完整组件(源码 + 手册):

    $ whereis mysql
    mysql: /usr/bin/mysql /usr/lib/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz
    

🧠 三、深入理解:为什么 whereis 不总是可靠?

虽然 whereis 很方便,但它有几个限制:

  1. 只在预设路径下搜索(通常为 /bin, /usr/bin, /usr/local/bin 等)。
    → 如果你把程序放在非标准路径(如 /opt/myapp),whereis 就找不到它。

  2. 不会检查是否在 $PATH
    → 即使你安装了 python,但如果没加到 $PATHwhich 找不到,而 whereis 还可能显示出来(因为它在标准路径中)

✅ 总结口诀(便于记忆)

🎯 which:你问我在哪?我只看 $PATH只看具体的命令能跑就给你地址!
🎯 whereis:我要找全家福!二进制、源码、手册都列出来!

安装依赖

✅ 一、前提:项目结构

假设你有一个 Python 项目:

myproject/
├── main.py
├── requirements.txt
└── setup.py (可选)

⚠️ 重点:所有依赖操作都应在虚拟环境中进行!避免污染全局 Python 环境
使用venv 创建一个独立的 每一个Python 环境都会包含自己的 pip(基础工具)、site-packages(用于安装第三方库)
其中的python版本是 你所创建venv 时候的 版本

📦 二、推荐方法:使用 pip + requirements.txt(最常用)

✅ 方法1:直接用 pip 安装单个包(临时或测试)

# 安装某个包,比如 requests
pip install requests

# 安装特定版本(如 2.28.1)
pip install requests==2.28.1

# 安装来自 GitHub 的包(注意:需要先安装 git)
pip install git+https://github.com/requests/requests.git@v2.28.1

🔍 注释:

  • pip 是 Python 标准包管理工具。
  • 不建议在全局环境下用 pip install,容易造成冲突。
  • 常用于快速测试或开发阶段。

✅ 方法2:使用 requirements.txt 文件(强烈推荐)

这是标准做法:将所有依赖写在一个文件里,便于复现环境。

Step 1:创建 requirements.txt 文件
# requirements.txt
# 这是一个注释行,以 # 开头会被忽略
# 使用 pip freeze 生成
# 也可以手动添加版本号

# Web 框架
Flask==2.3.3

# HTTP 请求库
requests>=2.28.0,<3.0.0

# 数据处理
pandas==2.0.3

# 数据库连接
psycopg2-binary==2.9.6

# 日志
loguru==0.7.0

# 可选依赖(非必需)
pytest>=7.0.0
black==23.1.0

🔍 注释:

  • 使用 == 表示精确版本(安全稳定)。
  • 使用 >= 表示大于等于某个版本,允许更新但不跳大版本。
  • ~= 表示“波浪符”版本控制(更智能):例如 numpy~=1.21 → 允许 1.21.x,但不允许 1.22。
  • 你可以用 pip show package 查看已安装包信息。
Step 2:安装这些依赖(在虚拟环境中)
# 从 requirements.txt 安装所有依赖
pip install -r requirements.txt

🔍 注释:

  • -r 表示 read from file(从文件读取)。
  • 所有依赖会自动安装,包括它们的子依赖。
  • 安装后可以运行 pip list 查看当前已安装包。
Step 3:导出当前环境的所有依赖(生成 requirements.txt
# 在虚拟环境中运行(确保只安装了你需要的包)
pip freeze > requirements.txt

🔍 注释:

  • pip freeze 输出当前环境中所有安装的包及其版本。类似pip list,但是用=连接,所以可以 生成requirements.txt

  • 此外!!!使用pip list命令可以列出已安装的所有包,而使用pip freeze命令则可以导出已安装包的列表

  • 如果要k=v格式列出所有的:pip list --format=freeze

  • > 将输出重定向到文件,覆盖原有内容。

  • ✅ 推荐:每次完成开发或部署前,执行一次 pip freeze > requirements.txt 来记录当前环境


🫠从第137行开始安装后续依赖,而不是从头开始—❤️🤩🤔

不合法的写法!因为 --index-url 必须在开头
pip install -r requirements.txt --skip-lines=136

# 查看第137行内容(Linux/macOS)
sed -n '137p' requirement.txt

# 生成新文件(从第137行开始)
tail -n +137 requirement.txt > temp_requirement.txt

# 安装
pip install -r temp_requirement.txt

# 删除临时文件
rm temp_requirement.txt

🫠重新创建干净的虚拟环境——❤️

# 退出当前虚拟环境
deactivate

# 删除旧的虚拟环境
rm -rf venv

# 重新创建虚拟环境
python -m venv venv
source venv/bin/activate

# 重新安装依赖(建议清理requirement.txt中的冲突版本)
pip install -r liantiao_ai_robot/requirement.txt

🔐 三、使用虚拟环境(必须操作!)——❤️

为了隔离项目、防止冲突,请务必使用虚拟环境。

1、创建虚拟环境(推荐方式:使用 venv

# 在项目根目录下创建虚拟环境
python -m venv venv

# 或者用 Python 3.8+
python3 -m venv env

🔍 注释:

  • venv 是 Python 内置模块。
  • 会创建一个名为 venv 的文件夹(你也可以叫它 env)。
  • 包含独立的 Python 解释器和 pip

2、激活虚拟环境

进去之后 ==只是依赖变了,其他的当前项目路径(pwd) 以及 执行的命令都没变!!!==正常操作就可以呢!!!

  • Linux/macOS

    source venv/bin/activate
    
  • Windows (CMD)

    venv\Scripts\activate
    
  • Windows (PowerShell)

    venv\Scripts\Activate.ps1
    

🔍 注释:

  • 激活后命令行前会有 (venv) 提示,表示你现在在虚拟环境中
  • 所有 pip install 都会作用于这个环境。

3、安装依赖

# 从 requirements.txt 安装所有依赖
pip install -r requirements.txt

4、运行项目、调试

5、退出虚拟环境

deactivate

❌ 不要提交 venv/ 到 Git!
✅ 应该提交 requirements.txt

四、不小心安装到了全局怎么办呢——❤️🤩🤔

✅ 方法1:卸载全局的包
你可以列出已安装的包,并手动删除它们。

# 查看所有已安装的包(包括全局的)
pip list

# 找出哪些是你从 requirements.txt 安装的,然后一个个卸载
pip uninstall 包名
或者更高效地一次性卸载:

✅ 方法2:# 假设你已经保存了原来的 requirement.txt
# 直接用 pip uninstall -r 要求文件(但注意这是全局的!)

pip uninstall -r requirements.txt

✅ 最后:检查一波
pip list // 看看是不是只有pip , setuptools 了呢

⚠️ 注意:pip uninstall -r requirements.txt 是危险操作,会把你在当前环境中安装的所有包都卸载!所以请谨慎使用。
但是这样还是 删除不干净!!!

# 删除通过pip安装的所有依赖包,只保留pip和setuptools
// 方法一
rm -rf venv
python -m venv venv
source venv/bin/activate  # Linux/macOS

// 方法二
# 1. 列出所有已安装的包(带版本)
pip freeze > installed_packages.txt
# 2. 过滤出除了 'pip' 和 'setuptools' 之外的包
grep -v "pip\s" installed_packages.txt | grep -v "setuptools\s" > to_uninstall.txt
# 3. 批量卸载
while read -r package; do
    if [[ "$package" =~ ^[^=]+ ]]; then
        pip uninstall -y "${package%%=*}"
    fi
done < to_uninstall.txt
# 清理临时文件
rm installed_packages.txt to_uninstall.txt
# 检查是否剩下了重要的两个,如果不对,还是执行 方法一吧
pip freeze


五、特殊的requirements.txt

–index-url http://
–trusted-host 
-e .

❓ 可以正常安装吗?

这样的 requirements.txt 能用 pip install -r requirements.txt 安装吗?

✅ 答案:✅ 可以!

虽然这个写法看起来有点奇怪(尤其是 --index-url--trusted-host),但这是合法的,并且能被 pip install -r 正确解析。


🔍 原因解释

这是一个 requirements.txt 文件的内容。注意:

  • --index-url:指定从 哪个镜像源下载包
  • --trusted-host允许连接不安全的主机(比如没有 HTTPS 的私有仓库)
  • -e .表示“以可编辑模式安装当前目录下的包”
⚠️ 注意:

这些参数是 pip 的命令行选项,不是 Python 包名!

所以如果你直接跑:

pip install -r requirements.txt

它会:

  1. 使用 http://pip.baidu.com/... 作为下载源
  2. 忽略 SSL 校验(因为 --trusted-host
  3. 安装当前目录(.)中的项目为“可编辑”状态

❓为什么最后要写 -e .?这样有什么好处?——❤️

🎯 答案:-e . 的作用是 —— “可编辑模式安装”

这在开发过程中非常重要!

💡 什么是“可编辑模式”(editable install)?

当你运行:

pip install -e .

它会在系统中创建一个 符号链接(symbolic link)egg-link 文件,指向当前目录的项目代码。

举个例子:

假设你的项目结构是:

myproject/
├── setup.py
└── myproject/
    └── __init__.py

执行:

cd myproject
pip install -e .

会把 myproject/ 目录作为一个 Python 包,安装到你的虚拟环境中,但:

✅ 你的代码文件没有被复制到 site-packages,而是通过软链接引用。
从而达到修改原始代码后,无需重新安装即可生效!


🌟 好处如下:
优点 说明
🛠️ 开发效率高 改代码 → 立即生效,不用 pip uninstall + pip install
🔄 多模块共享 可以多个项目依赖同一个本地库,而不会重复打包
🧪 调试方便 你可以用 IDE 直接打断点调试 myproject/__init__.py
🔁 自动更新 如果你在 Git 中拉取了新代码,下次运行程序自动加载最新版

类比 Java:就像你在 IDEA 中把 src/main/java 添加为模块路径,而不是编译成 JAR 后再引入。


⚠️ 注意事项
  • 必须有 setup.py 文件,并正确声明项目信息
  • 不能用于非 Python 项目(如 C++ 扩展等)

✅ 如何编写 setup.py?(配合 -e . 使用)

from setuptools import setup, find_packages

setup(
    name="myproject",
    version="0.1.0",
    packages=find_packages(),
    install_requires=[
        "flask>=2.0",
        "sqlalchemy>=1.4",
        # 其他依赖...
    ],
    entry_points={
        'console_scripts': [
            'myapp=main:main',
        ],
    },
)

然后运行:

pip install -e .

六、进阶做法:分离配置和安装逻辑

建议你将 requirements.txt 拆分为多个:

requirements.txt(生产环境)

flask==2.3.3
sqlalchemy==2.0.22
pymysql==1.1.0

requirements-dev.txt(开发环境)

-r requirements.txt
-e .
pytest>=7.0
black
isort

然后开发时运行:

pip install -r requirements-dev.txt

🧪 最终测试

确保一切正常:

# 安装
pip install -r requirements.txt

# 验证是否安装成功
python -c "import myproject; print(myproject.__version__)"

# 修改代码看看是否生效
echo "print('Hello from dev!')" >> myproject/__init__.py
python -c "import myproject; print(myproject.__doc__)"

Git——.gitingore的书写

❌ 不要提交 venv/ 到 Git!
✅ 应该提交 requirements.txt

🔹 什么是 .gitignore

它是 Git 用来忽略某些文件或目录不被提交到版本库中的配置文件。
比如:编译输出、日志、IDE 配置等,不需要纳入版本控制。


🔹 不同写法的含义

build/

表示 “忽略 build 文件夹及其所有内容”
例如:

project/
  build/        ← 被忽略
  src/
  test.py       ← 不被忽略

/build/

开头加了 / 表示从 仓库根目录开始匹配只忽略根下的 build 目录
如果你有多个地方叫 build(比如子目录里也有),它不会影响其他路径。

例子:

  • /build/ → 只忽略根目录下的 build 目录,不影响 src/build/
  • build/ → 忽略所有路径中出现的 build 文件夹(包括子目录)

⚠️ 注意:一般情况下,用 build/ 就够了,除非你想特别限定在根目录。


*.log

表示 忽略所有以 .log 结尾的文件(不限于位置)
例如:

app.log
error.log
logs/my.log

都会被忽略!

/log/

表示 忽略根目录下的 log 文件夹(注意是 / 开头)
如果子目录也有 log 文件夹,不会被忽略。

native_ai_robot/data

直接写文件夹名,表示忽略 nativeads_ai_robot/data 这个路径(相对路径,从根开始


🔹 如何忽略 test.py

只需在 .gitignore 中添加一行:

test.py

✅ 它会忽略根目录下的 test.py
如果你想忽略任意位置的 test.py,可以写:

**/test.py
  • ** 表示任意层级的子目录(递归)
  • 所以 **/test.py 会忽略:
    test.py
    /src/test.py
    /utils/test.py
    /a/b/c/test.py
    

✅ 小贴士

  1. 每行一个规则,空行或注释(以 # 开头)会被忽略
  2. 规则支持通配符 *?[] 等。
  3. 使用 ! 可以排除某个规则(比如:!important.txt 会保留这个文件)。
  4. 你可以用 gitignore.io 生成模板(如 Python、VSCode 等)。

更多推荐