Python與我的不解之緣

本文屬于裝糊涂的豬原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處作者
文中的兩個(gè)Demo地址位于:https://github.com/ftc300/PythonAmazing.git
歡迎follow and start哦
我是一個(gè)android開發(fā)者,但是不得不說python也給我?guī)砹藰啡づc便利

上周末雨后玄武湖火燒云美景,有幸親臨,拍攝技術(shù)有限,將就看看吧.jpg

這篇文章你將看到:

  • python的版本管理(virtualenv)
  • 一個(gè)有意思的小程序激發(fā)你的python熱情
  • 封裝代碼提交流程

對(duì)于初學(xué)者,Python的安裝也許并不容易,尤其面臨選擇python版本的困境,浪費(fèi)了很多寶貴的時(shí)間,甚至有讓人放棄的感覺。當(dāng)你拿到某個(gè)有趣的項(xiàng)目,一運(yùn)行就報(bào)錯(cuò),還在抱怨這個(gè)開發(fā)者是怎么回事時(shí),很可能其實(shí)是運(yùn)行的環(huán)境不對(duì),所以在學(xué)習(xí)python時(shí),我首先對(duì)python環(huán)境進(jìn)行了了解學(xué)習(xí)。也曾糾結(jié)學(xué)習(xí)python2還是pyhton3時(shí),但是當(dāng)你用了virtualenv后,還是不要思考這個(gè)問題了,兩個(gè)都學(xué)吧...
官方也給出了解釋:
Python2orPython3
個(gè)人覺得對(duì)語言環(huán)境重要性的認(rèn)識(shí)可能會(huì)為你省去很多煩惱,所以本文就先從能隔離出多個(gè)運(yùn)行環(huán)境的virtualenv說起吧 ...

撩你不解釋.gif

一、virtualenv

下面給出windows和mac 的virtualenv 的使用教程,也是給自己做個(gè)備忘錄。
使用流程大概就包括

  • 1、安裝virtualenv
  • 2、創(chuàng)建一個(gè)隔離環(huán)境
  • 3、激活并切換到virtualenv環(huán)境
  • 4、退出virtualenv環(huán)境

Windows:

1、安裝(略)
2、virtualenv venv
當(dāng)安裝多個(gè)版本需要指定Python版本路徑時(shí):
virtualenv venv --python=C:\Python2.7\python.exe
3、venv \Scripts\activate
4、venv\Scripts\deactivate

參考鏈接:python的virtualenv環(huán)境與使用

Mac:

參考鏈接:Python--Virtualenv簡(jiǎn)明教程

二、小程序提升興趣

運(yùn)行環(huán)境的是python 2.7
兩個(gè)模塊:
PIL :圖像處理標(biāo)準(zhǔn)庫(kù),通過pip install Pillow安裝吧
argparse:是python的命令行解析工具,或者說可以在python代碼中調(diào)用shell的一些命令,從而簡(jiǎn)化和系統(tǒng)命令之間的交互

下面是實(shí)現(xiàn)圖片轉(zhuǎn)成字符的代碼

#! /usr/bin/env python
# coding: utf-8

from PIL import Image
import argparse
# 命令行參數(shù)工具
# 此處不是重點(diǎn),故而不做講解,具體參見 (https://docs.python.org/2/library/argparse.html)

parser = argparse.ArgumentParser()
parser.add_argument('file')

args = parser.parse_args()
imgpath = args.file
# 變量ascii_char: 存儲(chǔ)用于顯示圖片的字符種類。我們要注意到,這個(gè)list的最后一個(gè)元素是空格,這表示,我們
# 將使用空格來代替原圖片中灰度值最高的像素點(diǎn)(在灰度圖像中,灰度值最高為255,代表白色,最低為0,代表黑色)。
# list中的第一個(gè)元素是$,這表示我們將使用$來代替原圖片中灰度值最低的像素點(diǎn)。其余字符依此類推。
ascii_char = list(r"$@&%B#=-. ")


# 把RGB轉(zhuǎn)為灰度值,并且返回該灰度值對(duì)應(yīng)的字符標(biāo)記
def select_ascii_char(r, g, b):
    gray = int((19595 * r + 38469 * g + 7472 * b) >> 16)  # ‘RGB-灰度值’轉(zhuǎn)換公式
    unit = 256.0/len(ascii_char)  # ascii_char中的一個(gè)字符所能表示的灰度值區(qū)間
    return ascii_char[int(gray/unit)]


# 返回給定路徑圖片的字符表示,用戶在此還可以指定輸出字符畫的寬度和高度
def output(imgpath, width=100, height=100):
    im = Image.open(imgpath)
    im = im.resize((width, height), Image.NEAREST)
    txt = ""

    for h in xrange(height):
        for w in xrange(width):
            txt += select_ascii_char(*im.getpixel((w, h))[:3])  # 此處請(qǐng)看詳解(1)
        txt += '\n'
    return txt


def save_as_txtfile(txt):
    with open('imgtochar.txt', 'wb') as f:
        f.write(txt)


if __name__ == '__main__':
    print output(imgpath, 120, 90)
    save_as_txtfile(output(imgpath, 120, 90))

效果:


hello.png
hello.png

三、封裝git代碼提交流程

我們?cè)谌粘5拈_發(fā)過程中,肯定會(huì)經(jīng)常要用到一些代碼版本控制工具,其中較為常用的如GitHub,當(dāng)然GitHub的命令已經(jīng)比較精簡(jiǎn)了,不過依照我們每個(gè)人的個(gè)人習(xí)慣不同還是可以進(jìn)行一些簡(jiǎn)單的封裝的。在日常開發(fā)中,不出意外每天寫完代碼,測(cè)試完功能就能提交代碼了 ,所以一般我就采用了如下囫圇吞棗式的提交方式了。


讓你偷懶,哈哈.gif
import subprocess
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('cmtmsg')
args = parser.parse_args()
msg = args.cmtmsg
print subprocess.Popen("cd .", shell=True, stdout=subprocess.PIPE).stdout.read()
print subprocess.Popen("git pull", shell=True, stdout=subprocess.PIPE).stdout.read()
print subprocess.Popen("git add .", shell=True, stdout=subprocess.PIPE).stdout.read()
print subprocess.Popen("git commit -m \""+msg +"\"", shell=True, stdout=subprocess.PIPE).stdout.read()
print subprocess.Popen("git push", shell=True, stdout=subprocess.PIPE).stdout.read()

對(duì)個(gè)別文件的操作這個(gè)就幫不上忙了,而且如果你一天的活或者完整功能都沒有結(jié)束,亦不適用哦。具體的一些git操作命令我是學(xué)習(xí)廖雪峰老師的教程的,因?yàn)槲矣X得寫得很好,一時(shí)激動(dòng)捐了20元,也是蠻佩服自己的。言歸正傳subprocess模塊給我?guī)砹藷o限的便利,上面的例子只是提供一個(gè)思路,你同樣可以封裝一些系統(tǒng)命令來簡(jiǎn)化你的工作,再如adb命令:

import subprocess

print subprocess.Popen("echo uninstall start***", shell=True, stdout=subprocess.PIPE).stdout.read()
print subprocess.Popen("adb uninstall com.xiaomi.smarthome", shell=True, stdout=subprocess.PIPE).stdout.read()
print subprocess.Popen("echo uninstall end***", shell=True, stdout=subprocess.PIPE).stdout.read()
print subprocess.Popen("echo install start***", shell=True, stdout=subprocess.PIPE).stdout.read()
p = subprocess.Popen("adb install %cd%/SmartHome.apk", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
    print line,
retval = p.wait()

如上實(shí)現(xiàn)的是卸載米家app并重新安裝的系列流程,但是如果git,adb命令都沒有加入系統(tǒng)環(huán)境變量中,以上代碼肯定是無效的,那么還在等什么是不是你也可以封裝一個(gè)將jdk、git、adb、gradle、gitk、python命令等統(tǒng)統(tǒng)加入環(huán)境變量的腳本,也方便你從現(xiàn)在公司刪數(shù)據(jù)庫(kù)跑路到新公司報(bào)道(開個(gè)玩笑),一鍵完成環(huán)境變量的設(shè)置的酷斃行為啊 ,當(dāng)然你最好還是按照你現(xiàn)在安裝路徑來安裝相關(guān)軟件。

文章到這里就要戛然而止了,在Python的道路上,我比較感謝以前的一個(gè)同事文杰,大家也可以去逛逛他的github地址。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容