[DA series - Learn Python with Steem #08] 函式庫(Modules)的安裝與使用,準備好玩Steem!

[DA series - Learn Python with Steem] 是DA(@deanliu & @antonsteemit)關於「從Python程式語言實做Steem區塊鏈的入門」的系列,歡迎趕緊入列學習!

前情提要:[DA series - Learn Python with Steem #07] 類別

第#08堂課,今天我們來學習Python的~~函式庫 !準備進入玩Steem的階段囉~~

Python的函式庫(Modules)安裝與使用

在介紹完了Python的基本指令之後,我們可以開始玩玩跟Steem有關的程式啦!

在程式設計的世界裡,常常我們都需要透過導入「別人寫好的程式」來協助我們更快速的完成工作,這些「現成的程式」比較正統的名字稱為函式庫(Modules),或是比較通俗的說法是「套件」(Packages)。套一句我的老師說的話,這些人就像是做慈善的,免費幫我們寫好了一大堆的Function, Class等等,讓我們可以直接引入我們的程式中使用。在我們這系列簡介中,@yjcps很好心的為我們做了許多課後補充,其中他也先我們一步用到了 import這個關鍵字,其實這就是「導入函式庫」的過程。

在引入別人的程式之後,要怎麼使用通常要參考類似「說明書」的東西。這類文件被稱為Documentation(參考文件),在我們未來的教學裡面會用到steem-python這個套件,它的參考文件在這裡,大家可以先點進來參照一下,未來我們也會用到它。

Python pip

pip是一個Python套件的「管理系統」。在Python的社群裡,這群愛做善事的開發者常常把自己寫好的套件包註冊到這個pip平台上,,如此一來大家都可以輕鬆的利用pip簡單的指令由終端機安裝這些套件包了。當然,STEEM的開發者們也不例外,我們要使用的套件包正是名叫steem-python的東西,也是要透過pip來安裝。聽起來簡單方便,但是由於大家電腦環境不同,很容易遇到各種安裝bug,所以今天就讓我們一起來想辦法安裝這個steem-python

Linux & Mac

Linux 跟 Mac的使用者,可以先到終端機試著輸入pip,看看自己的電腦認不認得這個指令。如果認得就不需要重新安裝,若還沒安裝的話則使用以下指令安裝pip:

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py

有了pip之後,只要在終端機輸入

pip install steem

就可以快速安裝完成了。

Windows

Windows的用戶們應該是最辛苦的,因為steem要用到的一些其他套件包在windows上很多都沒有支援,因此無法直接用簡單的pip install指令來安裝。經過我努力的尋找,發現最簡單的方法是直接安裝另一個名叫Anaconda的python環境。

  1. MiniConda選擇下載Windows作業系統,python3.6的Conda(64bit懶人連結)。

  2. 下載完成後就可以安裝了。安裝時建議勾選這兩個選項,可以直接讓新安裝的python變成預設的python。網路上有其他人建議大家在安裝之前先到新增或移除程式的地方刪除以前安裝的python3.6或是python3.7,免得以後不小心混淆。

  3. 安裝完成之後重新開機,接著在開啟到command Line,輸入以下魔法指令:
    conda config --add channels conda-forge
    conda install steem

  4. 如果到這裡結束都很順利的話,可以在終端機直接輸入python打開python的終端機,接著輸入import steem。順利執行的話代表自己已經順利安裝啦。

Windows 安裝 C++ Build Tool

如果你在Windows安裝過程中出現 Microsoft Visual C++ 14.0 is required這樣的錯誤代碼,是因為你的環境中還缺少了編譯C++的工具。

  1. 此位置下載Visual Studio 安裝器
  2. 下載完成後執行安裝器,並且在工作負載的頁面選擇「使用C++的工作開發」,接著等待電腦下載+安裝。
  3. 安裝完成之後再試試看從壞掉的步驟開始重新執行。

安裝完成之後

儘管上述過程看似簡單,但每個人在安裝過程中還有可能遇到各種奇怪的問題,如果遇到了可以留在留言區大家互相幫忙一下,或是直接複製錯誤代碼去Google,應該也會有不少神人出來解惑。總之,先假設大家裝好了,就來個steem-python最簡單範例給大家玩玩看。

複製以下代碼,存成check_balance.py,並一樣於終端機執行:

from steem import Steem
s = Steem()
balance = s.get_account('antonsteemit')['sbd_balance']
print(balance)

當然,大家應該把中間get_account()的帳號名換成自己的帳號名啦!如果正常顯示出自己的SBD Balance,就真是太棒啦!以後就可以這樣偷窺別人的資產了。

補充內容:Argv

以上的程式碼已經可以成為我們第一個可以拿來使用的腳本工具了,只要我們想要查誰的帳號餘額,就只要替換中間的帳號名,重新執行即可。可是以一個腳本來說,每次要打開來更換內容好像有一點嫩,所以今天來教教大家利用Argv這個東西,來讀取command line啟動python時的其他參數:

from steem import Steem
import sys

account_name = sys.argv[1]
s = Steem()
balance = s.get_account(account_name)['sbd_balance']
print(balance)

執行:

python check_balance.py antonsteemit

About Import

這裡首先我們先好好介紹上面兩個看似相似的import語法。這兩行分別想要導入steem以及sys(意思是system)這兩個函示庫,但是一個寫法是from A import B,一個是直接import A。其實這之間的差別就在於前者只想要導入函示庫中的Class B (或Function B),而後者是把所有的內容都導入進來。

我們使用的import sys指令會把sys這個套件所有內容都打包,稱為「sys」一起導入到程式中,所以後來當我們要使用argv這個函示時,我們必須要使用sys.argv,python才知道我們是要使用sys這個函示庫裡面的東西。如果直接下argv的指令,會出現函示未定義的錯誤。

不過如果你真的很不喜歡這些「.」,又想要一次導入一整個函示庫所有的function的話,還可以使用from A import *這樣的寫法。import * 代表著導入裡面所有的內容,相當於from A import B, C, D,E,.... 所以現在BCDE這些函示都可直接在程式中被使用了。不過這樣的寫法會把程式變得比較混亂,因為讀者不容易知道哪個Function來自哪個套件。

我們這裡import sys的寫法其實可以換成 from sys import argv,因為我們的程式裡其實只是想要用到全部sys函式庫裡面argv這一個函式。

About argv

接下來我們介紹一下argv這個函式。

注意到我們原本程式中的account_name是直接寫定了等於某一個字串,但現在改成了sys.argv[1]。它的意思就是「抓取我們執行程式時,輸入的內容」。我們這次執行這個python檔的時候不只是執行python check_balance.py,而是python check_balance.py antonsteemit,其中python指令之後所以用空格分開的元素都會被存在這個argv的List裡面,我們可以透過先後順序來存取; 其中argv[0]是我們腳本的名字(check_balance.py),而我輸入的antonsteemit則是argv[1]來存取。

寫成這樣的版本之後,我們以後就可以盡情的搜尋所有人的balance啦!試著執行:

python check_balance.py antonsteemit
python check_balance.py deanliu
python check_balance.py BlahBlahBlah

是不是有自己越來越厲害的感覺呢~ 今天就先上課到這裡吧! 至於作業嘛... 那就幫助其他同學安裝steem-python好了!!!

我們下篇文章再見囉~下課!

class-377117_1280.jpg
image - pixabay

Sort:  

刚从Windows安装steem-python的坑里爬出来...
安装steem-python遇到的问题

我虽然没发现新装的MiniConda怎么玩,但是我无意间发现vscode可以这样设置,我将配置编译改成Anaconda就可以运行了~
image.png
底部改后的结果是这样的,就能运行成功了
image.png

通过当中的语句我发现我新装的Anaconda在D盘所以之前都选择错了,但是重新试了后我还是玩不来Anaconda下怎么运行我写好的程序😭
请老师说明下执行:
python check_balance.py
是再哪里执行?我有点懵😵

Uncomplicated article. I learned a lot of interesting and cognitive. I'm screwed up with you, I'll be glad to reciprocal subscription))

我是Mac... 執行python get-pip.py後,錯誤訊息如下:

Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/pip'
Consider using the --user option or check the permissions.

對!我也是同學啦,大家別搞錯了... 快來幫我解決問題吧~~

没有mac,应该是权限不够,用root用户权限安装一下,Ubuntu上是在命令前面加sudo 使用root权限,图片.png

mac 的话等你去探索一下。

或者在命令后面加--user
图片.png

咦?加 --user似乎就裝好了.... 但是還有這個訊息:

The script wheel is installed in '/Users/xxxxxx/Library/Python/2.7/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.

然後終端機還是認不得pip指令.... 是不是跟這段話有關呢?

对的,安装目录没有添加到PATH这个环境变量 ,所以找不到pip。
可以试一下:

export PATH="$PATH:/Users/xxxxxx/Library/Python/2.7/bin"

然后把PATH里的目录打印出来看看有没有添加成功:

echo $PATH

其他的方法:

  • 把目录添加到 /etc/paths 文件
  • 新建一个 /etc/paths.d/XXX文件 把目录添加到里面

由于没有mac设备,这些方法没有验证是否有效,
可以放Google 找一下“mac path”看有没有有效的方法。

後面執行有問題嗎?
貌似這個pip是裝到python2底下(應該是有內建python2.7),可以試試看用以下方法確定安裝pip到python3之下:
(btw,電腦裡同時有python2跟python3的話,在執行python程式時要輸入python3 script.py

# download and install setuptools
curl -O https://bootstrap.pypa.io/ez_setup.py
python3 ez_setup.py
# download and install pip
curl -O https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py

這個新安裝的pip會被稱為pip3
所以你裝完之後可以試試看

pip3 install steem-python

看不懂你說的,但照做了,最後出現紅訊息:

Could not find a version that satisfies the requirement steem-python (from versions: )
No matching distribution found for steem-python

@antonsteemit 命令写错了
pip3 install steem-python

你看文章开头:

pip3 install steem

感謝!輸入後,跑了好多好多東西出來,但其中不停出現紅色訊息,一共4條,最後一條最長,給各位看看:

Failed building wheel for scrypt
Failed building wheel for pycrypto
Failed building wheel for ujson
Command "/Library/Frameworks/Python.framework/Versions/3.7/bin/python3 -u -c "import setuptools, tokenize;file='/private/var/folders/c8/23zvw8w5501g6wnhpd0gjt_h0000gn/T/pip-install-cj0tzfjw/scrypt/setup.py';f=getattr(tokenize, 'open', open)(file);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, file, 'exec'))" install --record /private/var/folders/c8/23zvw8w5501g6wnhpd0gjt_h0000gn/T/pip-record-3f6wksc0/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /private/var/folders/c8/23zvw8w5501g6wnhpd0gjt_h0000gn/T/pip-install-cj0tzfjw/scrypt/

我晚點再來試試後面的步驟能不能做....

好期待直接玩到呀 :P

太好了,今晚回家馬上玩

到>>> import steem 都成功,可是再入python check_balance.py kona就卡住了,
再找一找上面同學們的教學,加上這句就成功了:
pip install -U steemdata

我都不好意思來留言⋯還卡在安裝那裡😭

沒事,有空再來學。

網路上有其他人建議大家在安裝之前先到新增或移除程式的地方刪除以前安裝的python3.6或是python3.7,免得以後不小心混淆。

这个到底要不要删除呐?不删除会怎么混淆?造成什么后果?删除了后如果安装,我vscode要怎么重新设置??一头雾水,求教!!

@shine.wong 如果同台電腦安裝多種版本python的話,由於在執行python檔案時,也因為作業系統不同會預設使用不同版本的python,所以常常有人「自以為自己是用python3.6,其實是在用python3.7」這種狀況。刪除先前版本只是可以確定你現在在用哪個版本的python,應該可以省去debug很多麻煩

vscode只是編輯程式的編輯器,應該不用重新設置喔~

image.png
为虾米装好后是这个样子哒呀~??路径下有文件存在,文件就是copy老师代码的那段固定用户名的~
image.png
用doc命令可以跑的出结果,进入python的終端機后怎么就不行了呐??

@shin.wong 你一開始已經先打了python,意思是開啟python程式
所以後來看到界面上有

>>>

這樣代表你現在直接在終端機中「編輯一份python文件,並且用python執行」。
所以你輸入

>>> python check_balance.py

代表你在「python腳本中加了一句 python check_balance.py 」,所以python執行時發現這段語法奇怪,於是出現syntex Error。

我在我的文章中沒寫清楚。我一開始使用python 直接開啟python程式之後,只是想要快速測試steem有沒有安裝成功,因此腳本內容只有一行 import steem。執行完成沒有錯誤後,我就關掉這個python程式了 (可以輸入 exit()來關閉,或是直接關掉終端機重來。)

後面打的那串 python check_balance.py 是「使用python執行後面這個腳本」
所以應該是一個「下給終端機的指令」,而不是「下給python的指令」

整理一下:

  • 下給終端機的指令應該是 「用python執行某些腳本」(python check_balance.py 等)
  • 在終端機若只輸入 python,後面沒有腳本名,終端機便會幫你開啟python程式編輯器。

我好像明白了,所以再doc下运行出来是你本来想表达的方式。我只是正好撞上了正确的方式~

哎呀,誤會大了

用了sys.arg这个函示后我只能再doc下直接用

python D:\PythonProject\check_balance.py shine.wong

这样的方法来运行文件,好奇怪啊~是因为装了2个python的关系吗?而且vsCode没法直接F5运行!是这样子的吗??

補充一下,我說的終端機就是你的doc,所以這樣執行是正確的!
vsCode沒辦法運行,是因為執行時它其實是自動幫你執行:
python check_balance.py
程式運作過程中就會發現少了一個參數: shine.wong

所以用了 sys.argv這種方法後,就只能用正規的終端機(你說的doc)呼叫了~

Coin Marketplace

STEEM 0.15
TRX 0.12
JST 0.025
BTC 54134.64
ETH 2467.37
USDT 1.00
SBD 2.16