Python连接云端Linux服务器进行远程 (后端开发/深度学习)时候的注意事项
Python云端远程开发,遇到的相关的知识点。比如Linux以及shell的常用的命令,使用pyenv管理pyhton的版本!类似Vue使用nvm管理的!编写 `setup.py`?(配合 `-e .` 使用)Python连接云端Linux服务器进行远程 (后端开发/深度学习)时候的注意事项。深度学习,AI,神经网络,入门教程
Python连接云端Linux服务器进行远程 (后端开发/深度学习)时候的注意事项
- ooooop——❤️
- Linux 和 shell
- 安装依赖
- Git——.gitingore的书写
ooooop——❤️
插件:
code runner,DataBase Clientcode-style
还有特定语言的 去 特定的 快速开始——插件网站
修改:rules,comate设置
下载依赖,跑通代码,可以不用跑通,可以先看懂!如果没时间的话 ——> 询问Zulu,实际讲解一个例子,看懂主要涉及到的文件——> 注释加上之后,git commit——> 分解需求为n个阶段,思考详细完整的prompt,询问Ducc
自己思考的原则:
不必要的换行 不需要,还增加token
阶段划分,详细prompt
更新逻辑:1️⃣ 2️⃣ 3️⃣ … 就像解释黑马到课程流程图一样,需要自己脑子里面想好流程图,然后详细描述给
指令结合代码,指出引用的函数,就像你自己思考写入代码的过程
把自己能写出来的 代码写出来,比如查询条件
及时保存!!再去问ducc ,每次改完之后对比!,问ducc中途别动代码
Prompt 附上:
附上已有的控制台的输出
要求不要删除已有的函数定义,可以增加函数定义
要求每一个步骤完成,需要打印控制台日志,并做好分割线到处理,以便清晰可见
要求做好 鲁棒性的处理,如果没有查询到正确的数据,需要打印 出详细的原因
要求循序渐进的处理,先完成第一阶段的内容,然后停止,我自己去检查,之后还会再次找您完成后续阶段的任务,以及补充更多的内容,谢谢您

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 # 重启服务
- 用户必须在
sudoers文件中被授权(默认大多数用户不在) - 第一次输入时会提示输入自己的密码(不是 root 密码)
- 成功后可以运行带
sudo的命令
su 和 sudo 的区别:
| 命令 | 作用 | 权限 | 是否需要密码 |
|---|---|---|---|
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 Bash或WSL ( Windows Subsystem for Linux ) 获得更完整的Linux Bash环境
推荐使用现代的Windows终端 (Windows Terminal) 来统一管理它们
1. 使用Windows自带工具
- PowerShell (推荐的Windows Shell):
- 在开始菜单搜索 “PowerShell” 或 “Windows PowerShell” 并打开。
它功能强大,支持跨平台,是Windows的现代化命令行工具。
命令提示符 (CMD): - 在开始菜单搜索 “cmd” 或 “命令提示符” 并打开。
- 在开始菜单搜索 “PowerShell” 或 “Windows PowerShell” 并打开。
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 的典型用途:
-
检查某个命令是否可用:
$ which ls /bin/ls→ 如果返回路径,则说明
ls存在;否则不存在。 -
查看当前使用的命令版本(比如区分
python是哪个解释器):$ which python /home/user/.pyenv/shims/python→ 显示你当前激活的 Python 是通过 pyenv 安装的。
-
判断是否有冲突的命令(多个同名命令):
$ which python /usr/bin/python /home/user/.local/bin/python
⚠️ 注意:
which是 shell 内建命令(type更准确),但大多数情况够用。
✅ whereis 的典型用途:
-
查找一个命令的完整信息(尤其是开发人员):
$ whereis gcc gcc: /usr/bin/gcc /usr/lib/gcc /usr/share/man/man1/gcc.1.gz→ 可以看到编译器、库文件和手册页。
-
检查是否安装了某个软件包的完整组件(源码 + 手册):
$ whereis mysql mysql: /usr/bin/mysql /usr/lib/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz
🧠 三、深入理解:为什么 whereis 不总是可靠?
虽然 whereis 很方便,但它有几个限制:
-
只在预设路径下搜索(通常为
/bin,/usr/bin,/usr/local/bin等)。
→ 如果你把程序放在非标准路径(如/opt/myapp),whereis就找不到它。 -
不会检查是否在
$PATH中
→ 即使你安装了python,但如果没加到$PATH,which找不到,而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
它会:
- 使用
http://pip.baidu.com/...作为下载源 - 忽略 SSL 校验(因为
--trusted-host) - 安装当前目录(
.)中的项目为“可编辑”状态
❓为什么最后要写 -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
✅ 小贴士
- 每行一个规则,空行或注释(以
#开头)会被忽略 - 规则支持通配符
*、?、[]等。 - 使用
!可以排除某个规则(比如:!important.txt会保留这个文件)。 - 你可以用 gitignore.io 生成模板(如 Python、VSCode 等)。
更多推荐
所有评论(0)