LinuxPython未分類

使用Sphinx生成Python說明文件

本文介紹如何使用Sphinx,簡單將在套件裡辛辛苦苦寫的Python docstring轉換成HTML,直接變成漂亮的說明網站~

前置作業

  • 內含docstring的套件(可用參考網站的參考套件範例:python-dev-setup)
  • 建立虛擬環境(跟套件在同一個目錄底下比較方便,參考網站是將兩者都放在根目錄下)

按順序在終端機輸入以下指令

$ pip install vitualenv # download vitualenv
$ virtualenv venv # create virtual environment
$ . venv/bin/activate # activate virtual environment
$ pip3 install autopep8 
$ pip3 install pylint
$ pip3 install coverage
$  pip3 install -U sphinx
$ pip3 install sphinx_rtd_theme

以上的動作是因為,開發環境需要Python2.7版本,為了不與自己電腦的Python3.6版本混在一起,於是使用vitualenv建立一個名叫venv的虛擬環境(可自行命名),再下載所需套件與Sphinx,其中Sphinx_rtd_theme是一種Sphinx的主題風格

sphinx-quickstart

建立好虛擬環境後,可以開始使用sphinx-quickstart,輸入以下指令

$ . venv/bin/activate
$ mkdir docs
$ cd docs
$ sphinx-quickstart # queries on basic setup shall starts

欢迎使用 Sphinx 3.4.1 快速配置工具。 (最新版可接受python3.6.9的註解型態的版本,例如: log(listA) -> list:)

獨立的源文件和建構目錄(y/n) [n]: y

項目名稱:

作者名稱:

項目發行版本 []:

項目語種 [en]: en

設定autodoc路徑

上述跑完後會出現一些檔案,先修改docs/source/conf.py的內容,找到 Path setup ,修改成以下內容

import os
import sys
sys.path.insert(0, os.path.abspath('../../')) # 參考圖1檔案的位階
# this conf.py is in ./docs/source/conf.py
# therefore our source code is up 2 level then the directory of python source code is the i.e. ./python_dev_setup
圖1.資料階層

設定HTML主題

在./docs/source/conf.py

html_theme = 'sphinx_rtd_theme'

設定型態提示風格

同樣在./docs/source/conf.py

extensions = [ sphinx.ext.napoleon ]

設定index.rst

內容完全照搬就對了~頂多變更標題

Python Dev Environment in VSCode (標題)
====================================================================
.. toctree::
   :maxdepth: 2
   :caption: Readme
   readme
.. toctree::
   :maxdepth: 2
   :caption: Docstring
   docstring/modules
.. toctree::
   :maxdepth: 2
   :caption: Index
   indices

建立readme.rst

手動建立docs/source/readme.rst ,內容為

.. include:: ../../README.rst

如此一來readme.rst就會參考在根目錄下(跟套件同一位階)的README.rst全部內容

建立indices.rst

手動建立docs/source/indices.rst,內容為

Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

建立Python 說明文件

$ . venv/bin/activate
$ rm -Rf docs/build
$ rm -Rf docs/source/docstring
$ sphinx-apidoc -f -o docs/source/docstring/ python_dev_setup # this is the steps where the docstring/modules going to be filled with our code docstring

其中是指python_dev_setup 套件路徑,注意要與前面的路徑用空格分開

最後輸入

$ cd docs && make html && cd ..

看到下圖代表完成,可進入該路徑點進去看看網頁長怎樣(見證奇蹟的一刻!)

Project裡含多個套件的情況

在sphinx-quickstart的階段輸入正確的project名稱,或是選擇在docs/source/conf.py裡面找到Project information 修改project參數

先照著標題sphinx-quickstart做直到以下兩條指令前停

$ sphinx-apidoc -f -o docs/source/docstring/ package 
$ cd docs && make html && cd ..

只要將上述指令中的package換上自己的套件位置並執行到第二行,執行完後可再換同位址不同套件的位置再執行建立HTML,最後生成兩個套件都在同一個HTML裡

結語

使用Sphinx快速生成Python說明文件實在是太幸福了XD 非常值得花時間摸索

參考網站

Python

將自己的python package上傳到PyPI

跟著官方教學(以下稱作官網)與參考文章從不會到會花了我半天時間,但跟著做大致上不會出錯,此文章紀錄一些上傳到PyPI遇到的困難,大致上是在官網的文件上加上自己的理解與筆記。

建議順序

將package上傳至PyPI前的大致過程,因此以下幾點並非本文之後的大標題,建議按此順序上傳會比較順利

  • 上傳package到github
  • 撰寫README.md
  • 註冊TestPyPI
  • 跟著官網學習上傳package到TestPyPI
  • 註冊PyPI
  • 上傳到PyPI

—上傳前—

package檔案結構

以下是官網舉一個package上傳的範例,相當於自己寫好的python package原始狀態,但其實此專案底下有多個package也沒問題

packaging_tutorial (專案/資料夾)
└── example_pkg (package/資料夾)
  └── __init__.py (使example_pkg成為package/ py檔)
  └── modules.py (模組/ py檔)

接下來照著步驟開始建立setup.py、README.md、LICENSE三個檔案,其中tests是一個資料夾,完全照著官網做的話要留著,建立完後會如以下結構:

packaging_tutorial
├── LICENSE (授權文件/ txt檔)
├── README.md (package簡介/ md檔)
├── example_pkg
│  └── init.py
│  └── modules.py
├── setup.py (package基本資訊/ py檔)
└── tests (官網要求建立/資料夾)

setup.py

須注意官網中classifiers的部份,其中 “License :: OSI Approved :: MIT License",指的是package的授權,若是正式上傳到PyPI時要注意自己願意的授權方式 ; “Operating System :: OS Independent" 指的是此package在PyPI的分類類別,可於https://pypi.org/classifiers/挑選合適類別

README.md

若github有寫好便可直接使用,但注意不要放圖

LICENSE

package的授權文件,須注意要與setup.py中的授權方式一樣,可於https://choosealicense.com/挑授權方式,複製內容後存成txt檔

—上傳 TestPyPI—

更新setuptools和wheel

python3 -m pip install –user –upgrade setuptools wheel

再進入專案資料夾路徑,運行以下指令,會產生大量檔案

python3 setup.py sdist bdist_wheel

TestPyPI

登入TestPyPI並驗證信箱完畢後,先建立API tokens,路徑為右上角的帳號按鈕->Account settings ->API tokens。

API tokens

須注意tokens為提高安全性,當下建立的tokens只能使用這次,關掉網頁後就沒有了,因此先放在旁邊備用

上傳package

安裝Twine:

python3 -m pip install –user –upgrade twine

在同一專案資料夾路徑下運行以下程式碼,會上傳dist資料夾內所有檔案到TestPyPI上

python3 -m twine upload –repository testpypi dist/*

運行後會出現Enter your username,請輸入 __token__ ,password則使用剛剛放在旁邊備用的pypi- 開頭密碼,密碼複製貼上後不會顯示出來,貼一次就好(以為沒貼到貼了好幾次的我

成功的話會跑出Uploading 100%等字

下載package

查看package是否確實上傳到TestPyPI上,以及可否下載,路徑在右上角的帳號按鈕->Your projects->在自己的專案下點Manage->點入最上方含有簡短介紹的專案-> 複製 pip install -i https://test.pypi.org/simple/ example-pkg-YOUR-USERNAME-HERE->於終端機上運行下載

測試package

確認下載後自己的package是否能正常使用,或有缺漏等等。都確認正常後,就差最後一里路:正式上PyPI !

—正式上傳 PyPI—

註冊登入PyPI後,跟著本文標題的—上傳 TestPyPI— 的步驟全部再跑一次會比較順利,但在上傳package上傳dist資料夾內所有檔案的指令

python3 -m twine upload –repository testpypi dist/*

要換成

python3 -m twine upload dist/*

結語

最後可以直接用pip install來下載自己的package,超讚!

業配文:https://pypi.org/project/TimesML/

Machine learningPython

使用CNN對MNIST手寫數據集進行訓練(CPU或GPU運算)

電腦硬體

處理器(CPU):Intel® Core™ i5-10300H CPU @ 2.50GHz
顯示晶片(GPU):NVIDIA® GeForce GTX 1650 Ti

Python程式環境

  • Tensorflow-gpu-1.15.0
  • Keras 2.3.1

MNIST手寫數據集

mnist為手寫數字0-9的黑白圖片數據集。
圖片與對應標籤方面,數量為training data:55000筆,validation data:5000; 僅有圖片的test data:10000筆; 每張黑白圖片大小為[1,28,28,1](張,寬,長,通道),有784個像素(pixels),每個像素值都是數字0-255(0黑255白)。
標籤與圖片的手寫數字對應,如圖片內為手寫數字5,標籤就設5,0-9種手寫圖片就有10個標籤,可用list儲存,如圖片1,5,8,6,4對應標籤就是label=[1,5,8,6,4]

虛擬碼

  1. 下載mnist數據集,分成training data 跟test data
  2. 先處理圖片,將其轉換成列表形式,並透過標準化將所有像素值變成0-1之間
  3. 標籤處理成one hot encoding 形式
  4. 建立CNN網路
  5. 編譯模型
  6. 訓練模型
  7. 衡量模型訓練誤差

CNN網路架構

問題

因為下載的是Tensorflow-gpu-1.15.0,相對的版本使用Keras 2.3.1,若直接跑Keras寫的CNN程式碼,會產生以下錯誤(部份節錄)

Epoch 1/1
2020-08-14 18:01:49.576948: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10.0
2020-08-14 18:01:49.775817: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7
2020-08-14 18:01:50.056149: E tensorflow/stream_executor/cuda/cuda_dnn.cc:329] Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
2020-08-14 18:01:50.062654: E tensorflow/stream_executor/cuda/cuda_dnn.cc:329] Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
Traceback (most recent call last):
File “test.py", line 49, in
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1)
File “/home/leodflag5/.local/lib/python3.6/site-packages/keras/engine/training.py", line 1239, in fit
validation_freq=validation_freq)
File “/home/leodflag5/.local/lib/python3.6/site-packages/keras/engine/training_arrays.py", line 196, in fit_loop
outs = fit_function(ins_batch)
File “/home/leodflag5/.local/lib/python3.6/site-packages/tensorflow_core/python/keras/backend.py", line 3476, in call
run_metadata=self.run_metadata)
File “/home/leodflag5/.local/lib/python3.6/site-packages/tensorflow_core/python/client/session.py", line 1472, in call
run_metadata_ptr)
tensorflow.python.framework.errors_impl.UnknownError: 2 root error(s) found.
(0) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
[[{{node conv2d_1/convolution}}]]
(1) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
[[{{node conv2d_1/convolution}}]]
[[metrics/accuracy/Identity/_91]]
0 successful operations.
0 derived errors ignored.

關閉GPU,使用CPU運算

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

使用GPU運算

import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.allow_growth=True
session=tf.InteractiveSession(config=config)

CPU運算時間

GPU 運算時間

大約差4倍,GPU還有使用CUDA加速運算