继续python进阶学习
virtualenv
虚拟环境变量,virtualenv 本身是一个工具,命令行工具
通过 pip install virtualenv
安装
pip是一个package管理工具,有点java maven、node webpack & npm &yarn。和npm非常像。
virtualenv 目的是在你工程目录下创建一个独立的python命令及相关命令库,同时把依赖的第三方包都房主工程目录下统一管理。也就是每个project的运行环境独立了,用java的体系来讲就是每个project有个自己的jdk和三方jar库。这个也和前端工程目录结构类似,node_modules 就是跟工程走,而不是全局的,因为每个工程对用的package有自己的版本诉求。
- my_project
├── src
├── tests
└── venv- ├── Scripts
└── Lib- └── site-packages
- ├── Scripts
这里的site-package就是三分包安装目录。通过 pip install package_name
安装。
问题:
- 工程内的site-packages和全局python/Lib下的site-packages存在依赖继承关系。理论是工程内先读取自己虚拟环境内,此前读取全局,这块具体什么个机制没有多少文档加以指导。
- 开启虚拟环境是,package并没有理想的安装在虚拟目录site-packages下,反而安装在全局,这块也没找到多少文档指导。
pycharm 和 cmd 两种方式都试了virtualenv机制,同时测试 --system-site-packages 参数,都不太好用。少数情况下安装在虚拟目录中,大多安装在全局目录下,这块问题待后续慢慢查找吧。要么理论没学好(文档少),要么python自身bug。
class namespace
类机制作为一个高级语言是必备支持能力,就是面向对象编程理论。python也不例外的支持class。学习class就得学习命名空间和变量作用域,这个一定得懂,不然看不懂代码。
官网给了一段code,非常准确的描述了作用域关系。
def scope_test():
def do_local():
spam = "local spam"
def do_nonlocal():
nonlocal spam
spam = "nonlocal spam"
def do_global():
global spam
spam = "global spam"
spam = "test spam"
do_local()
print("After local assignment:", spam)
do_nonlocal()
print("After nonlocal assignment:", spam)
do_global()
print("After global assignment:", spam)
scope_test()
print("In global scope:", spam)
运行结果:
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
原理(看懂这个,跨一大步):
局部 赋值(这是默认状态)不会改变 scope_test 对 spam 的绑定。 nonlocal 赋值会改变 scope_test 对 spam 的绑定,而 global 赋值会改变模块层级的绑定。
其他
如conda 工具值 anaconda、miniconda的使用,和pip&virtualenv是一样的。
学海无涯,逆行而上。