Python environment
Ubuntu 源码安装 Python
sudo apt update
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev wget libbz2-dev
wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz
tar -xf Python-3.7.4.tgz
cd Python-3.7.4
./configure --enable-optimizations --prefix=/usr/local/python3.7
make -j 8
sudo make altinstall
ln -s /usr/local/python3.7/bin/python3.7 /usr/local/bin/python3.7
ln -s /usr/local/python3.7/bin/pip3.7 /usr/local/bin/pip3.7可以在 ~/.bashrc 或 /etc/profile 中添加 Python 安装的可执行文件到 PATH 环境变量。
export PATH="$PATH:/usr/local/python3.7/bin/"$ . ~/bashrc # 需重启
$ . /etc/profile # 无需重启某些用 pip 安装的包会在 setup.py 文件中的 setup 函数中指定 scripts 参数,这些脚本将被复制到 /usr/local/python3.7/bin 目录下。例如:pdfminer 的源码中
setup(..., scripts = ["tools/pdf2txt.py", "tools/dumppdf.py"], ...)Ubuntu apt 安装 Python
在 Linux 上,时常会出现多个 python,尤其是在不熟悉的机器上,可能会发现
这些命令同时存在,此时可以使用 update-alternatives 命令对其进行管理,作为最佳实践,会将 python 2.x版本全部”绑定“到 /usr/bin/python 上,将 python 3.x 版本全部绑定到 /usr/bin/python3 上。具体过程如下
这样便形成了一个软链接 /usr/local/bin/python3 -> /etc/alternatives/python3,并且 python 3.7 的优先级高于 python 3.6。此时 python3 代表的就是 python3.7 了。关于 update-alternatives 的具体说明参考 update-alternatives。
备注:此处推荐将目标地址设定在 /usr/local/bin/python3 而不在 /usr/bin/python3,因为按 Linux 的目录结构规范,/usr/bin 目录应该由包管理器 apt 来管理,而 /usr/local/bin 是由 root 用户来手动管理的。
备注:python 2.x 的官方维护期限为2020年1月1号,因此新版本的系统上可能不会再使用 python 2.x 了,因此也可以用 update-alternatives 将 python 3.x 管理起来后,再 /usr/local/bin/python 直接软链接到 /usr/local/bin/python3。
Python 程序的运行方式
命令行的启动方式主要有以下两种
两者的区别可用例子看出
例子:
在与 b、c 目录同级的目录下启动
总结:
相同点:
os.getcwd()对于两种启动方式是一致的,以运行命令的位置一致两者都将启动的
.py文件的__name__赋值为"__main__"
不同点:
采用
python b/c/b.py运行时,sys.path会将b/c目录添加,而python -m b.c.b会将当前目录添加到sys.path中
除此以外,使用 python -m b.b 运行时还有两个特殊之处:
如果
b.b是已经用pip install安装的包名,则可以在任意目录使用该方式运行脚本,无论该脚本是否被加入setup.py文件的setup.py的entry_points参数中。例如:
torch 1.9.0 版本可以用如下方式启动多卡运行脚本
以
python -m b.b运行时,b/b.py中的相对路径导入可以部分起作用,例如:from .s import s,但不能使用from ..c import c,否则会报错若切换到
b目录,以python b.py而言,即使使用from .s import s,仍然会直接报错
调试
pudb 调试快捷键
pdb 调试
使用 VSCode 调试 Python 代码的 launch.json 文件模板
上面的配置等价于这种写法:
Python编程规范
参考链接(待整理)
1. 命名规范
类
函数/类的方法
模块名
变量名
2. 其他
3. type hint 与 stub file
注意 Python 解释器不会真的按照注解来检查输入输出,这些信息只是为了方便程序员理解代码、代码文档自动生成以及 IDE 的自动提示。
如果不使用这种方式进行注解,还可以利用 .pyi 文件。这种 .pyi 文件被称为存根文件(stub fiile),类似与 C 语言中的函数声明,详情可参考 stackoverflow 问答,例如:
例如: 将 pkg.py 和 pkg.pyi 文件放在 mypkg 目录下, 使用 mypy 进行静态检查:
这种 .pyi 文件除了用于注释普通 .py 文件外,通常也用来注释 Python 包中引入的 C 代码。例如在 Pytorch 1.9.0 中,在 torch/_C 目录下就有许多 .pyi 文件,例如 torch/_C/__init__.pyi 文件如下内容:
4. 避免pycharm中shadows name "xxx" from outer scope的警告
以下是两个典型的情形(注意: 这两段代码从语法及运行上说是完全正确的)
修改方式: 将形式参数重命名即可
为何要做这种规范(参考stackoverflow回答): 以第一段代码为例, 假设print_data内部语句很多, 在开发过程中突然想将形式参数data重命名为d, 但可能会由于疏忽漏改了函数内部的某个data, 这样代码会出现不可预料的错误, 有时难以发现(相对于这种情形: 假设一开始将形式参数命名为d, 现在希望将形式参数命名为c, 结果由于疏忽漏改了某个d, 这样程序会立刻报错). 当然, 许多IDE对重命名做的很完善, 减少了上述错误发生的可能性.
5. 工具
安装:
pip install pre-commit在与
.git目录同级的目录下新建一个.pre-commit-config.yaml在与
.git目录同级的目录下运行这条命令将对
.git/hooks目录新创建一个pre-commit文件,其内容是一个可执行脚本执行
git commit时会自动触发上述钩子
pip
修改pip/conda镜像源
单次使用
永久使用
修改相关文件的内容如下,没有的话创建一个。
windows下的文件为C:\Users\54120\pip\pip.ini,linux下的文件为~/.pip/pip.conf
conda国内镜像方式为:
window下
linux下
vim ~/.condarc
pip命令
离线安装python包
平时用的 pip install 命令的执行逻辑是如果需要下载,则先执行 pip download,再进行安装。因此大部分情况下,将 pip install 替换为 pip download -d <dirname> 即可实现只下载安装包而不安装。
有网环境下载安装包
如果无网环境的设备与有网环境的设备平台不一致(例如外网电脑是 Windows 系统,内网电脑是 Linux Ubuntu 系统),需要增加额外参数例如 platform、abi、python-version 等。详情可以参考 stackoverflow 问答以及它推荐的链接。例如:
其中,platform 参数的具体值可以在无网环境下使用如下方式得到(注意:要将所有的 . 与 - 替换为 _。)
将文件拷贝至无网环境安装
疑难杂症
在 Windows 下有时会因为权限问题,在执行
时,因为没有安装权限,导致原有的 pip 被卸载而更新的 pip 又不能正常安装。此时可以使用如下方式恢复
之后保证权限后正常更新 pip 即可
在使用 pip install -e . 时, site-packages/easy_install.pth中会增加一行, 如果遇到pip uninstall不了的情况, 可以删除掉这一行
conda 使用
基本操作
创建环境
删除环境
查看所有环境
进入终端后自动激活conda base环境
不同环境设定不同的环境变量
以设定 cuda 相关的环境变量为例,以 Windows 为例,linux 类似。相关的官方文档参见此处。只需手动增加两个文件即可:
例如:CONDA_ROOT 为 anaconda 的安装路径,例如 D:/anaconda3,而 ENV_NAME 为环境名,例如:tf2.7。例如:tf2.7 表明此环境下需要安装 tensorflow 2.7.0 版本。其依赖关系从官网上可以查到,依赖:
支持 cuda 11.2 以上版本的显卡驱动
cuda 11.2
cudnn 8.1.0
为此,需要手动安装好相应版本的 cuda 与 cudnn,两者均可以安装多个版本。为了使得进入 tf2.7 环境时,自动选择 cuda 11.2 及相应版本的 cudnn,只需要配置如下两个文件即可。作用时进入 tf2.7 环境时,设定好 %PATH% 变量,退出时恢复原本的 %PATH%。
${CONDA_ROOT}/envs/${ENV_NAME}/etc/conda/activate.d/activate.bat
${CONDA_ROOT}/envs/${ENV_NAME}/etc/conda/deactivate.d/deactivate.bat
Ipython在终端的使用
使用ipython启动, 如果要在一个cell中输入多行, 则可以使用ctrl+o快捷键, 注意不要连续使用两个enter或者在最后一行输入enter, 否则会使得当前cell被运行
jupyter使用
kernel添加与删除
以conda管理为例, 假设需要将环境temp加入到jupyter中, 首先执行:
接下来继续将temp加入至jupyter的kernel中:
使用:
命令模式快捷键
当光标停留某个block里面的时候, 可以按下Esc键进入命令模式, 命令模式下的快捷键主要有:
A: 在上方插入一个block, B: 在下方插入一个block
VSCode
备注:
yapf,autopep8,black 均为将代码格式化的工具
快捷键
alt+左方向键:跳转回退
Last updated
Was this helpful?