python学习之virtualenv&pip&namespace

Owen Jia 2022年12月20日 28次浏览

继续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

这里的site-package就是三分包安装目录。通过 pip install package_name安装。

问题:

  1. 工程内的site-packages和全局python/Lib下的site-packages存在依赖继承关系。理论是工程内先读取自己虚拟环境内,此前读取全局,这块具体什么个机制没有多少文档加以指导。
  2. 开启虚拟环境是,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是一样的。

学海无涯,逆行而上。