Python 是一個方便且強大的語言,給予開發者極大的彈性,但是這樣的彈性也造成很多開發上的混亂,例如不同的開發與部屬環境、工程師不同的開發習慣,所幸的是有不少的工具可以幫助我們解決這些問題,當環境與套件等問題被解決後,大家可以集中更多心力在程式上,藉由這些工具的組合可以讓團隊開發更輕鬆。

  1. 首先需要以下這4個工具:
    • git:版本控制
    • virtualenv:將專案所需要的環境獨立開來,避免污染
    • pip:套件安裝與管理
    • make:腳本工具,簡化專案控制
  2. 開啟一個 python 的專案,在裡頭包含以下 3 個檔案:
    • .gitignore:濾掉不需要被紀錄的檔案類型
    • requirements.txt:指名清楚需要的套件與版本
    • Makefile:描述在專案中會需要的操作指令
  3. 透過 git 與 make 來操作專案
    Clone project
    git clone https://repository/...
    
    為專案開虛擬環境,在 Makefile 中有預先定義好了 build27, build32, build33, build34, build35
    make build35
    source local/bin/activate
    
    安裝我們在 requirements.txt 指定的套件
    make install
    
    執行測試
    make test
    
    清除 pyc, pyo 或一些暫存的檔案
    make clean
    


以下再分別對.gitignore, requirements.txt, makefile作描述

.gitignore

用定義檔來忽略不需要被紀錄到 git 中的類型,保持專案的乾淨,這是別人整理好的各種 gitignore templates

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]

# C extensions
*.so

# Distribution / packaging
bin/
build/
develop-eggs/
dist/
eggs/
lib/
env/
include/
local/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg

# Installer logs
pip-log.txt
pip-delete-this-directory.txt
pip-selfcheck.json

# Unit test / coverage reports
.tox/
.coverage
.cache
nosetests.xml
coverage.xml

# Translations
*.mo

# Mr Developer
.mr.developer.cfg
.project
.pydevproject

# Rope
.ropeproject

# Django stuff:
*.log
*.pot

# Sphinx documentation
docs/_build/

requirements.txt

在 python 中可以利用 pip 來安裝套件,這是個非常好用的工具,除了PyPI上的套件外,也可以用 pip 從私人的 git repository 來安裝。我們透過 requirements format 來描述專案需要的套件及版本,之後只需要透過 pip install -r requirements.txt 就可以安裝好套件。

requirements.txt:

beautifulsoup4>=4.4
-e git://github.com/kennethreitz/requests/@v2.13.0#egg=requests

如果因為網路受阻,無法去抓取 PyPI 的套件時,可以透過自建一個 private PyPI repo 來處理。

Makefile

Make 是個非常好的腳本工具,藉由設定好對應的規則可以簡化操作,避免下重複指令或輸入錯誤的指令,在這裡參考 python project makefile 定義了這些規則: build27, build32, build33, build34, build35, install, test, clean等等

Makefile:

SHELL=/bin/bash
TEST_PATH=./tests

.PHONY: auto install test clean

auto: build35 install

build27:
	virtualenv local --python=python2.7 --never-download --system-site-packages

build32:
	virtualenv local --python=python3.2 --never-download --system-site-packages

build33:
	virtualenv local --python=python3.3 --never-download --system-site-packages

build34:
	virtualenv local --python=python3.4 --never-download --system-site-packages

build35:
	virtualenv local --python=python3.5 --never-download --system-site-packages

install:
	local/bin/pip install -r requirements.txt

clean-pyc:
	find . -name '*.pyc' -exec rm --force {} +
	find . -name '*.pyo' -exec rm --force {} +
	find . -name '*~' -exec rm --force {} +

clean-build:
	rm --force --recursive build/
	rm --force --recursive dist/
	rm --force --recursive *.egg-info

test: clean-pyc
	. local/bin/activate && python -m pytest "$(TEST_PATH)"

clean: clean-pyc clean-build
	rm --recursive --force local
廣告