1. 程式人生 > >笨方法學Python練習46:一個專案的骨架

笨方法學Python練習46:一個專案的骨架

操作環境:Debain ×64
常見liunx命令大全:http://blog.csdn.net/pony_kinght/article/details/78510168

建立骨架內容

~ $ mkdir -p projects
~ $ cd projects/
~/projects $ mkdir skeleton
~/projects $ cd skeleton
~/projects/skeleton $ mkdir bin NAME tests docs

mkdir dir –建立目錄
mkdir -p dir –建立遞迴目錄

引數P代表parents,表示遞迴建立目錄。
列如:
如果要建立目錄A
並建立目錄A的子目錄B,沒有用-p的情況下是mkdir 2次 如果用-p 可以直接建立2個目錄 mkdir -p 目錄A/子目錄B就可以。

cd file_name –開啟檔案

配置初始檔案

~/projects/skeleton $ touch NAME/__init__.py
~/projects/skeleton $ touch tests/__init__.py

touch file_name –建立檔案

建立setup.py
touch setup.py

try:
    from setuptools import setup
except ImportError:
    from
distutils.core import setup config = { 'description': 'My Project', 'author': 'My Name', 'url': 'URL to get it at.', 'download_url': 'Where to download it.', 'author_email': 'My email.', 'version': '0.1', 'install_requires': ['nose'], 'packages': ['NAME'], 'scripts'
: [], 'name': 'projectname' } setup(**config)

從setuptools 匯入 setup, 然後編寫 setup()函式,這個函式裡面有相當多的屬性,比如version 代表版本號,description 是描述文件,author是作者等,如果是正規的開發,所有這些東西都應該按照規範去寫。其中比較重要的幾個選項是:
name,表示模組的名稱
packages,表示包所在的目錄

有的時候我們寫的程式碼需要引入一些額外的資訊檔案,比如文字檔案,或者圖片,說明檔案等等,這些東西是需要一塊打包的,那麼這個時候該如何指定呢?此時需要用到 data_files 這個選項了。data_files的寫法是:data_files= [(‘檔案要放入的資料夾1’,[‘file1’,file2’]),(‘檔案要放入的資料夾2’,[‘file3’,file4’])],file1,file2等是檔案的名稱,注意data_files的元素都是元組,元組的第一個元素是檔案要放入的資料夾名稱,第二個元素是檔案列表。這裡需要注意的是,如果不想把檔案放入資料夾,可以將元組的第一個元素指定為空字串,此時要打包的檔案要被放入根目錄,這裡根目錄是指python直譯器所在的目錄。比如我需要將檔案資源放入python直譯器所在目錄下的/Lib/site-packages/myfolder路徑,myfolder是自定義的資料夾,元組的第一個元素就可以寫‘Lib/site-packages/myfolder’,打包時會自動在指定位置新建一個名為myfolder的目錄,將檔案資源放入其中。

其實 setup.py 檔案的編寫還有非常多的內容,這裡只是介紹了九牛一毛。後面接觸到了更復雜的再繼續補充吧。具體還是要參考官方文件。

簡單來說,linux下的打包命令是:python setup.py sdist 為模組建立一個原始碼包。在windows下,可以使用 python setup.py bdist_wininst 生成一個exe檔案。雙擊該exe檔案,就會彈出python庫的安裝介面(就是經典的藍色介面),可以自己選擇要安裝的位置(特別是電腦中有多個版本的python的時候,需要指定這個庫裝到哪個python庫目錄下),一路下一步,就安裝成功了。此時去指定的python庫目錄下,就會發現多出了一些我們自己安裝的檔案以及資料夾。此時試著import一下,就會發現已經可以匯入我們自己的模組了。

setup函式的一些引數


packages
告訴Distutils需要處理那些包(包含__init__.py的資料夾)
package_dir
告訴Distutils哪些目錄下的檔案被對映到哪個原始碼包,感覺好像是一個相對路徑的定義。一個例子:package_dir = {'': 'lib'},表示以lib為主目錄。
ext_modules
是一個包含Extension例項的列表,Extension的定義也有一些引數。
ext_package
定義extension的相對路徑
requires
定義依賴哪些模組
provides
定義可以為哪些模組提供依賴
scripts
指定python原始碼檔案,可以從命令列執行。在安裝時指定--install-script
package_data
通常包含與包實現相關的一些資料檔案或類似於readme的檔案。
package_data = {'': ['*.txt'], 'mypkg': ['data/*.dat'],}
表示包含所有目錄下得txt檔案和mypkg/data目錄下的所有dat檔案
data_files
指定其他的一些檔案(如配置檔案)

建立骨架測試檔案
命令:cd tests
命令:touch NAME_tests.py

from nose.tools import *
import NAME
def setup():
    print "SETUP!"
def teardown():
    print "TEAR DOWN!"
def test_basic():
    print "I RAN!"

安裝軟體包

簡介:

pip是一個以Python計算機程式語言寫成的軟體包管理系統,他可以安裝和管理軟體包

pip的其中一個主要特點就是其方便使用的命令列介面,這讓使用者可以透過以下的一句文字命令來輕易地安裝Python軟體包:

pip install some-package-name

此外,使用者也可以輕易地透過以下的命令來移除軟體包:

pip uninstall some-package-name

pip也擁有一個透過“需求”檔案來管理軟體包和其相應版本數目的完整列表之功能,這容許一個完整軟體包組合可以在另一個環境(如另一部電腦)或虛擬化環境中進行有效率的重新創造。這個功能可以透過一個已正確進行格式化的文字檔案和以下的命令來完成:

pip install -r requirements.txt
通過查閱 Distribute 的文件 https://pythonhosted.org/distribute/ 可知,目前它是 setuptools 的一個棄用版本。自從 setuptools0.7 釋出之後,這兩種工具已經合併,並且 distribute 也就沒有再被提起過了。不過由於 setuptools 不支援 Python3 ,故在將來, distribute 將會有很大程式的優化和完善。


命令:sudo apt intall python-nose
nose是用於python程式單元測試的第三方包

virtualenv 用來建立隔離的Python環境
建立一個虛擬環境:virtualenv 目錄名
damao@damao:~$ virtualenv ~/Desktop/virtualpython

Running virtualenv with interpreter /usr/bin/python2
New python executable in /home/damao/Desktop/virtualpython/bin/python2
Also creating executable in /home/damao/Desktop/virtualpython/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.
啟用一個虛擬環境:進入上一步建立的目錄執行 source bin/activate
damao@damao:~/Desktop/virtualpython$ source bin/activate

(virtualpython) damao@damao:~/Desktop/virtualpython$

啟用成功的話,提示符前面會顯示之前建立的虛擬環境的名稱
虛擬環境下安裝包:使用pip或setup.py都行
## 在虛擬環境中安裝bottle框架:

(virtualpython) damao@damao:~/Desktop/virtualpython$ pip install bottle

Collecting bottle
  Downloading bottle-0.12.9.tar.gz (69kB)
    100% |████████████████████████████████| 71kB 100kB/s
Building wheels for collected packages: bottle
  Running setup.py bdist_wheel for bottle ... done
  Stored in directory: /home/damao/.cache/pip/wheels/6e/87/89/f7ddd6721f4a208d44f2dac02f281b2403a314dd735d2b0e61
Successfully built bottle
Installing collected packages: bottle
Successfully installed bottle-0.12.9


## 進入虛擬環境的bin目錄可以檢視剛安裝的bottle框架


(virtualpython) damao@damao:~/Desktop/virtualpython/bin$ ls

activate       activate_this.py  easy_install      pip2    python2        wheel
activate.csh   bottle.py         easy_install-2.7  pip2.7  python2.7
activate.fish  bottle.pyc        pip               python  python-config
退出虛擬環境:deactivate

以樹形結構圖顯示目錄
安裝命令:sudo apt-get install tree

[email protected]:~/Desktop/projects/skeleton$ sudo apt-get install tree
[sudo] pony 的密碼:
正在讀取軟體包列表... 完成
正在分析軟體包的依賴關係樹       
正在讀取狀態資訊... 完成       
下列軟體包是自動安裝的並且現在不需要了:
  gir1.2-appindicator3-0.1 libappindicator3-1 libdbusmenu-gtk3-4
  libfile-copy-recursive-perl libidn11:i386 libindicator3-7
  libjsoncpp1 libmuparser2v5 librecad-data liburcu4
  linux-headers-4.9.0-deepin11-amd64
  linux-headers-4.9.0-deepin11-common
  linux-headers-4.9.0-deepin9-amd64
  linux-headers-4.9.0-deepin9-common
  linux-image-4.9.0-deepin11-amd64
  linux-image-4.9.0-deepin9-amd64-unsigned putty-tools
  python-appindicator python-gconf python-pexpect python-ptyprocess
  python-support update-inetd
使用'sudo apt autoremove'來解除安裝它(它們)。
下列【新】軟體包將被安裝:
  tree
升級了 0 個軟體包,新安裝了 1 個軟體包,要解除安裝 0 個軟體包,有 0 個軟體包未被升級。
需要下載 46.1 kB 的歸檔。
解壓縮後會消耗 106 kB 的額外空間。
獲取:1 http://packages.deepin.com/deepin panda/main amd64 tree amd64 1.7.0-5 [46.1 kB]
已下載 46.1 kB,耗時 8秒 (5,688 B/s)                                
正在選中未選擇的軟體包 tree。
(正在讀取資料庫 ... 系統當前共安裝有 251389 個檔案和目錄。)
正準備解包 .../tree_1.7.0-5_amd64.deb  ...
正在解包 tree (1.7.0-5) ...
正在設定 tree (1.7.0-5) ...
正在處理用於 man-db (2.7.6.1-2) 的觸發器 ...

輸入命令即可以樹形結構顯示該目錄下的所有資料夾和檔案

[email protected]:~/Desktop/projects/skeleton$ tree
.
├── bin
├── CCC.egg-info
│   ├── dependency_links.txt
│   ├── PKG-INFO
│   ├── requires.txt
│   ├── SOURCES.txt
│   └── top_level.txt
├── dist
│   ├── CCC-0.1.tar.gz
│   └── projectname-0.1.tar.gz
├── docs
├── NAME
│   ├── __init__.py
│   └── __init__.pyc
├── projectname.egg-info
│   ├── dependency_links.txt
│   ├── PKG-INFO
│   ├── requires.txt
│   ├── SOURCES.txt
│   └── top_level.txt
├── setup.py
└── tests
    ├── CCC_tests.py
    ├── CCC_tests.pyc
    ├── __init__.py
    └── __init__.pyc

7 directories, 19 files

另外一種顯示樹形結構的方法
命令:ls -R

[email protected]:~/Desktop/projects/skeleton$ ls -R
.:
bin           dist  NAME                  setup.py
CCC.egg-info  docs  projectname.egg-info  tests

./bin:

./CCC.egg-info:
dependency_links.txt  requires.txt  top_level.txt
PKG-INFO              SOURCES.txt

./dist:
CCC-0.1.tar.gz  projectname-0.1.tar.gz

./docs:

./NAME:
__init__.py  __init__.pyc

./projectname.egg-info:
dependency_links.txt  requires.txt  top_level.txt
PKG-INFO              SOURCES.txt

./tests:
CCC_tests.py  CCC_tests.pyc  __init__.py  __init__.pyc

測試配置

pony@pony-PC:~/Desktop/projects/skeleton$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.005s

OK

安裝你的模組
命令:python setup.py install
編輯好自己的模組以後就可以使用上面的命令安裝你自己的模組。

相關推薦

法學Python練習46一個專案骨架

操作環境:Debain ×64 常見liunx命令大全:http://blog.csdn.net/pony_kinght/article/details/78510168 建立骨架內容 ~ $ mkdir -p projects ~ $ cd proj

法學Python—習題40模組、類和物件

Python是一種面向物件biancheng(OPP)語言。即,Python中有一種叫做類(class)的結構,通過它可用一種特殊的方式構造軟體。 模組和字典差不多 字典:一種將一個東西對應到另外一個的方式— 若有一個字典,其有一個叫‘apple’的鍵,想獲取值就需要: m

法學Python—習題41學習面向物件術語

單詞練習(術語學習) 1. 類(class):            告訴Python建立新型別的東西。 2. 物件(object):           兩個意思,最基本的東西(變數、語句等等),或者某個東西的例項。 3. 例項(instance):       是讓Py

法學Python 3 》24.更多的練習

本節課全是複習題,就是碼字碼字碼字,體驗一下碼農的感覺!!! 基礎練習: print("讓我們把所有的東西都練習一下") print('You\'d need to know \'bout escapes with \\ that do:') print('\n newl

法學 Python 3》28.布林表示式練習

上節課的邏輯組合的正式名稱是“布林邏輯表示式”,這節課我們要為下面的每一個邏輯寫出答案,然後啟動python,在終端錄入這些題目,確認你的答案是否正確! 基礎練習: True and False False and True 1 == 1 and 2 == 1 "test

法學python 習題46:一個專案骨架

專案骨架學會如何建立一個專案的“骨架”目錄。這個骨架目錄具備讓專案跑起來的所有基本內容。裡邊會包含你的專案檔案佈局、自動測試程式碼、模組及安裝指令碼。當你要建立一個新專案的時候,只需將這個目錄複製進去,改改目錄的名字,再編輯裡邊的檔案就行了。Python軟體包的安裝需要預先安

法學Python習題45—你來製作一個遊戲

你來製作一個遊戲在程式設計過程中,你需要的所有資訊網上都有,只需去搜索就行。這就需要使用正確的單詞進行搜尋,挑選正確的搜尋關鍵字事半功倍。下面將嘗試寫一個大的專案,並讓其執行起來。需求如下:1. 製作一個截然不同的遊戲。2. 使用多個檔案,並使用import呼叫這些檔案。確認

法學Python——習題40

around family 方法學 列表 init happy 編程 () pocket 之前例子講過關於字典、列表、字符串、元組,按書中所述,其實這些已經足夠寫一些代碼,但Python屬於面向對象的編程語言,本節所講的類,是必須要掌握的,雖然現在有些懵逼 1 clas

法學python(一)

編輯器 utf-8 python2.7 根據 not 腳本 運行腳本 文本編輯器 語句 環境:Notepad++,python2.7.13 編譯:先寫好.py文件,再在終端中用Python命令運行腳本(運行時終端目錄要位於運行的.py文件目錄) 習題一: 在python2版

法學python之import sys與from sys import argv的區別

use 直接 所有 pop 本想 write div 一個 ng- 這是在網上看到的一個大神的解答: sys is a module that contains “system functionality”. sys.argv is a list cont

法學Python》加分題10

print(r"\n 【換行】演示:", "\n第一行\n第二行") print("-" * 20) print(r"\\ 【反斜槓】演示:", "\n一個反斜槓:\\") print("-" * 20) print(r"\' 和 \" 【引號】演示:", "\n英文雙引號:\", 英文單引號:\'")

法學 Python 3》19.函式和變數

#def定義一個變數,cheese乳酪, crackers餅乾 def cheese_and_crackers(cheese_count, boxes_of_crackers): print(f"You have {cheese_count} cheeses!") print(f"You have {bo

法學Python(1-3)

習題1:第一個程式 print "Hello Word !" print "Hello Again" print "I like typing this" print "This is fun." print "Yay! Printing." print

法學Python(4-6)

習題4:變數和命名 # -- coding:utf-8 -- # 10輛車 cars = 100 # 車內的空間 space_in_a_car = 4.0 # 司機 drivers = 30 # 乘客 passengers = 90 # 沒有開的車 ca

法學python 習題24

該節程式碼如下 print "Let's practice everything." print 'you\'d need to konw \'bout escape with \\ that do \n newlines and \t tabs.' p

法學python》第三版 來自Percal25號行星的哥頓人

from sys import exit from random import randint class Scene(object): def enter(self): print("This scene is not yet configured

法學python 習題32

在這個習題中,作者主要是想讓我們熟悉一下列表操作,在這裡我已經在程式碼中加入了自己的理解。 the_count = [1, 2, 3, 4, 5] #定義列表,如果

法學Python 3》30. else和if

基礎練習: people = 30 cars = 40 trucks = 15 if cars > people: print("We should take the cars.///我們應該乘汽車。") elif cars < people: prin

法學Python 3》31. 作出決定

知識點: 本節課重點是講你可以在 if 語句內部再放一個 if 語句。還有Zed的垃圾小遊戲,機翻,不明所以,完全get不到他的點。 基礎練習: print("""You enter a dark room with two doors. Do you go throg

法學 Python 3》32. for 迴圈和列表

        我們在開始使用 for 迴圈前,你需要在某個位置存放迴圈的結果。最好的方法就是使用列表(list),顧名思義,它就是一個從頭到尾按順序存放東西的容器。         首先我們看看如何建立列表: hairs = ['brown', 'blond', 're