python編寫簡單的setup.py

lyrichu發表於2017-05-06

  學習python也已經有一段時間了,發現python作為指令碼語言一個很重要的特點就是簡單易用,而且擁有巨多的第三方庫,幾乎方方面面的庫都有,無論你處於哪個行業,想做什麼工作,幾乎都能找到對應的第三方庫。別人造好了輪子,我們直接拿過來用,這大大方便了開發,也極大地提升了效率。那麼問題來了,有那麼多的第三方庫,我們如何開發一個屬於自己的庫呢?其實這是一個比較大的問題,因為開發一個庫涉及到的問題很多,比如這個庫要用來幹嘛,實現什麼功能,有沒有已經類似的庫了,效率如何等。但是這裡,我只想拋磚引玉,簡單記錄一下開發的基本流程。

  編寫python的第三方庫,最終要的一個工作就是編寫setup.py了,其實如果我們下載過一些第三庫的原始碼檔案,開啟之後一般就會有一個setup.py,執行python setup.py install 就可以安裝這個庫了。setup.py 如何編寫內容很多,可以參考官方文件:https://wiki.python.org/moin/Distutils/Tutorial?highlight=%28setup.py%29。一個典型的setup.py的寫法如下(參考自官方文件):

 1 from distutils.core import setup
 2 
 3 #This is a list of files to install, and where
 4 #(relative to the `root` dir, where setup.py is)
 5 #You could be more specific.
 6 files = ["things/*"]
 7 
 8 setup(name = "appname",
 9     version = "100",
10     description = "yadda yadda",
11     author = "myself and I",
12     author_email = "email@someplace.com",
13     url = "whatever",
14     #Name the folder where your packages live:
15     #(If you have other packages (dirs) or modules (py files) then
16     #put them into the package directory - they will be found 
17     #recursively.)
18     packages = [`package`],
19     #`package` package must contain files (see list above)
20     #I called the package `package` thus cleverly confusing the whole issue...
21     #This dict maps the package name =to=> directories
22     #It says, package *needs* these files.
23     package_data = {`package` : files },
24     #`runner` is in the root.
25     scripts = ["runner"],
26     long_description = """Really long text here.""" 
27     #
28     #This next part it for the Cheese Shop, look a little down the page.
29     #classifiers = []     
30 ) 

首先,當然是建立一個名字叫setup.py的檔案啦。 從distutils.core 匯入 setup, 然後編寫 setup()函式,這個函式裡面有相當多的屬性,比如version 代表版本號,description 是描述文件,author是作者等,如果是正規的開發,所有這些東西都應該按照規範去寫。其中比較重要的幾個選項是,name,表示模組的名稱。packages,表示包所在的目錄,如果我們要打包的所有python檔案都在根目錄,即和setup.py是一個目錄,那麼直接寫 packages=[“”]就可以了。如果python檔案在一個單獨的資料夾,和setup.py不在同一個目錄,則需要寫 package_dir=[“”:”python 檔案所在的目錄名字”],比如如果有foo1.py 和 foo2.py這兩個檔案,在src這個資料夾,那麼需要寫package_dir=[“”:”src”],同時寫

packages=[“”],打包就可以匯入foo1和foo2兩個模組了。如果想在同一個包中包含多個模組,比如在foo包中包含foo1和foo2兩個模組,則可以直接把foo1.py和foo2.py所在的資料夾直接命名為foo,然後寫 packages[“foo”] (注意foo資料夾需要有__init__.py這個檔案,可以為空,這樣才能引用到foo1和foo2)。其他還有很多寫法,這篇博文總結的很好,http://www.cnblogs.com/UnGeek/p/5922630.html,需要的朋友可以參考下。有的時候我們寫的程式碼需要引入一些額外的資訊檔案,比如文字檔案,或者圖片,說明檔案等等,這些東西是需要一塊打包的,那麼這個時候該如何指定呢?此時需要用到 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 檔案的編寫還有非常多的內容,這裡只是介紹了九牛一毛。後面接觸到了更復雜的再繼續補充吧。具體還是要參考官方文件。

最後一步就是打包命令了。這篇文章講的非常詳細:http://blog.csdn.net/lynn_kong/article/details/17540207,大家自行參考。

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

熱愛程式設計,熱愛機器學習!
github:http://www.github.com/Lyrichu
github blog:http://Lyrichu.github.io
個人部落格站點:http://www.movieb2b.com(不再維護)


相關文章