Python 开发环境 (conda=>Pipenv)

如何设置干净的 python 开发环境?

激发

  • 工欲善其事,必先利其器,愈学愈觉得环境干净的重要性
  • Q. 如何控制开发环境,形成干净的 requirements.txt?
    • 触发:Py101-004/chap3_note.md at master · JeetChan/Py101-004
      • 为应用开发虚拟环境,保证干净的开发环境/工作环境
      • 生成 requirements.txt 文件:pip freeze >requirements.txt
      • 对比发现自己的环境极其复杂,不相关的包也被列了出来
      • 混杂的环境意识到割离不同开发环境的必要性

参考

探索

  • #I 1 阅读 Python环境出坑记 | 浚宇的博客
    • 不怪 anaconda 本身,如果你是数据科学工作者,并不希望被环境折腾,利用这样的套件是避免底层环境配置的好办法。但是对于python 的开发者来说,了解python 的生态系统,能够自己动手配置适合自己开发的环境还是很有必要的。

#Q mac 的文件结构目录含义?

#Q shell 的工作原理是什么?

  • #A google :how shell work

    • => What is a shell and how does it work? · OSKAR
    • => xv6 - DRAFT as of September 3, 2014 - book-rev8.pdf
      • The shell is an ordinary program that reads commands From the user and executes them.and is the primary user interface to traditional Unix-like systems.

      • like this

      • 术语:

        • xv6
          • unix 原始操作程序,了解操作程序的好开端
        • Unix-like Interface
          • 类 Unix交互界面,其实就是命令行
        • Kernel 的传统结构
          • 传统结构:一个特殊的程序提供运行其他所有程序的服务
        • Process
          • 进程
          • a running program has memory contain
            • instruction
              • 指令,执行程序计算
            • data
              • 数据,即程序执行的变量
            • stack
              • 堆栈,组织程序的调用
              • organize procedur call
        • Procedure call
          • 程序调用
          • system call
            • 系统调用,调用 kernel 的服务
        • User Space vs Kernel Space
    • =>How does the shell work
      • the sequence of events

        • 1)bash calls fork() to create a new process.
        • 2)The parent process calls wait() and goes to sleep.
        • 3)More or less simultaneously the child process calls exec() to switch to the specified program.
        • 4)The program runs and outputs to the screen.
        • 5)The program exits. The kernel notifies bash.
        • 6)bash wakes up and prints a new prompt.
  • #O shell 就是一段程序,功能与图形界面基本相同,实现人与计算机交互的媒介,图形界面能做的事情 shell 都能做,而 shell 更利于日常操作的自动化

    • 个人理解:其实核心就2个动作
      • 1.位置: 找到执行文件
      • 2.动作: 执行文件,返回结果

#Q Console,Terminal 与 Shell 的区别 是什么?

  • #I 参考

  • #I 细分

    • Terminal

      • text input/output environment
      • 可以多个
      • 在古老的年代,一个机构可能只有一台主机,而机构的职员使用电传打印机(Teletypewritter 又简称为tty)通过串口连接到主机。后来人们又在电传打印机的基础上进行了改进,程序的输出不再是打印到纸带上而是显示在荧幕上,后来还支持彩色显示,这样的设备后来被称为终端(Terminal)。一台主机可以有很多个终端,早期的主机只支持串口线的终端,对应的设备叫做串口终端(Serials Terminal),后来又发展出了伪终端,以便于支持GUI,后来串口终端渐渐被图形界面的伪终端取代,也就是我们今天所说的终端

    • Console

      • physical terminal,包含计算机控件的仪表盘
      • 只有一个
      • 但是在主机的系统启动完成之前,终端是不能连接到主机上的。为了能记录出主机开机过程的日志,也便于在主机出故障无法启动操作系统时进行检修维护,有多了一个叫做控制台的设备。一台主机有且只能有一个控制台。文件主机的重要日志,比如开机关机的日志和记录,重要应用程序的日志,都会输出到控制台来。
    • Shell

      • command line interpreter
        • User <=> Kernel(Shell) <=> Hardware
        • 用户通过终端输入一些命令,而这些命令计算机读不懂,因此shell是一种解释程序,它把用户写的命令,比如ls,翻译成计算机能懂的二进制语言,计算机明白了就返回文字,输出到控制台,控制台再通过终端展现给用户,这时终端就有了输入输出的功能。

  • #O 小结

    • 用户在 Terminal 输入文本/命令,经过 Shell 的解释翻译成计算机能懂的二进制语言,执行指定程序并返回信息,具体的执行记录记录在 Console 中,而返回信息会再返回Terminal 呈现给用户.

#Q 如何任意配置独立适用的干净的开发环境?

  • #Q 0. 是否可以不卸载 connada 而使用pipenv?

    • #A google conda pipenv
    • =>pipenv with some packages from conda · Issue #1469 · pypa/pipenv
      • Conda is a system package manager that happens to specialize mostly in Python packages

      • #O 其实可以的,所有的包管理工具都是程序,只有 shell 命令才会激活,只是相互交叉使用时会出现问题,单独使用时没有问题的

      • #O 还可以设置 pipenv 使用 conda 里的 python,conda 里的包,不过实际运行依旧会错,分开用较好

      1
      2
      $ pipenv --python /path/to/condaenv/python --site-packages
      $ pipenv install
  • #A 1.pipenv下载尝试

  • #A 2. pipenv 试用

    • #A 创建虚拟环境 $ pipenv --three
    • #X 系统报错,报错信息摘要如下
    • #A 尝试其他命令pipenv update,报错依旧
      • Warning: the environment variable LANG is not set!

        • export LANG=en_US.UTF-8
      • ValueError: unknown locale: UTF-8

      • TypeError: 'NoneType' object is not subscriptable

        • 上一个错误消除了,这个错误自然消失
    • #O 可以成功运行
  • #A 3. pipenv 管理环境学习

    • #Q 关键问题: 如何创建新环境? 所谓的开发的环境包括哪些部分?
      • #O 所谓的环境即是依赖,即该程序正常运行所需要的组件
      • #O 原始的依赖管理有2种方式
        • Simple Requirements A list of top-level dependencies a project has, often without versions specified.
          • 清晰展现 top-level Package, 但是太简短 hold 不住版本变化
        • Exact Requirements A complete list of all dependencies a project has, each with exact versions specified.
          • 最佳实践,但是$ pip install --upgrade某些模块时体验不佳
        • pipenv 解决了这些问题
          • lock展示所有依赖包,并且可以实现任意的添加删除
          • graph 可以按层级展示所有依赖包
        • Amazing!
    • #A 查看 Readme
      • => pypa/pipenv: Python Development Workflow for Humans. readme 的说明及其详细贴心,以下的命令来自自我的实验尝试
        • #I 移动到项目所在位置:~/newproject
        • #I 尝试创建环境
          • 初始的 py3环境 pipenv --three

            • #X 错误代码摘要
              1
              2
              3
              4
              5
              6
              ERROR: The executable /Users/NBR-hugh/.local/share/virtualenvs/NBR-hugh-hUsIvz3I/bin/python3.6m is not functioning
              ERROR: It thinks sys.prefix is '/Users/NBR-hugh' (should be '/Users/NBR-hugh/.local/share/virtualenvs/NBR-hugh-hUsIvz3I')
              ERROR: virtualenv is not compatible with this system or executable

              Virtualenv location:
              Warning: Your Pipfile requires python_version 3.6, but you are using None (/bin/python).
            • #I conda 的 python 运行起来还是有问题的,还是用 brew 下载依赖时下载的 python 好了
              • #A google how to change python path on mac
            • #A 修改 path ,替换 conda 的 python
              • 打开配置文件 subl ~/.zshrc,将原本的
                • export PATH=~/anaconda3/bin:$PATH
              • 失效成 => #export PATH=~/anaconda3/bin:$PATH
            • #O pipenv --three 成功运行
        • #I 演示视频中的基本操作
          • 1.创建基本虚拟环境

            • pipenv --two py2 基本环境
            • pipenv --three py3基本环境
          • 2.安装包

            • pipenv install requests 安装 requests 包
            • pipenv uninstall requests 卸载 requests 包
            • pipenv uninstall --all卸载所有包
            • 批量安装?#W
              • Streamline development workflow by loading .env files.

          • 3.查看总环境文件

            • cat Pipfile
              1
              2
              3
              4
              5
              6
              7
              8
              9
              10
              11
              12
              13
              14
              15
              16
              17
              [[source]]

              url = "https://pypi.python.org/simple"
              verify_ssl = true
              name = "pypi"


              [packages]

              requests = "*"


              [dev-packages]



              [requires]
          • 4.将安装的包设为虚拟环境的依赖 pipenv lock

            1
            2
            3
            Locking [dev-packages] dependencies…
            Locking [packages] dependencies…
            Updated Pipfile.lock (7b8df8)!
          • 5.查看虚拟环境的依赖文件

            • 查看文件详细内容 cat Pipfile.lock

            • 简单查看 pipenv lock -r

              1
              2
              3
              4
              5
              certifi==2018.1.18
              chardet==3.0.4
              idna==2.6
              requests==2.18.4
              urllib3==1.22
            • 展现美观的依赖图谱pipenv graph

              1
              2
              3
              4
              5
              requests==2.18.4
              - certifi [required: >=2017.4.17, installed: 2018.1.18]
              - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
              - idna [required: >=2.5,<2.7, installed: 2.6]
              - urllib3 [required: >=1.21.1,<1.23, installed: 1.22]
          • 6.激活进入虚拟环境

            • pipenv shell
              • 生成当前环境需求文件pip freeze

                1
                2
                3
                4
                5
                certifi==2018.1.18
                chardet==3.0.4
                idna==2.6
                requests==2.18.4
                urllib3==1.22
              • 离开虚拟环境exit

TL

  • 180316 1T NBR-hugh 整理发布
(๑•̀ㅂ•́)و✧