純Python包發布setup腳本編寫示例


如果你有多個模塊需要發布,而它們又存在於多個包中,那么指定整個包比指定模塊可能要容易地多。即使你的模塊並不在一個包內,這種做法也行的通;你可以告訴Distutils從根包(root package)處理模塊,並且它工作起來和其他任意的包一樣(除非你不需要擁有一個__init__.py文件)。

例1.1 根包發布

文件結構為:

<root>/ setup.py foo.py bar.py

setup腳本可以這樣寫:

from distutils.core import setup setup(name='foobar', version='1.0', packages=[''], )

(空字符串表示根包)

例1.2 根包發布(模塊在子目錄)

如果你把上例中兩個模塊文件移入到一個子目錄,但是它們仍在根包中,如:

<root>/ setup.py src/ foo.py bar.py

那么將仍然指定根包,但是你必須告訴Distutils那些源文件在哪里:

from distutils.core import setup setup(name='foobar', version='1.0', package_dir={'': 'src'}, packages=[''], )

例2.1 包發布

如果你想發布在同一包中(或者在子包中)的多個模塊。比如,如果foobar 模塊屬於包foobar,文件結構如下:

<root>/ setup.py foobar/ __init__.py foo.py bar.py

實際上這是Distutils默認的層次,一個精簡的setup腳本可以這樣寫:

from distutils.core import setup setup(name='foobar', version='1.0', packages=['foobar'], )

例2.2 包發布(模塊所在目錄名不是包名)

如果你想將模塊放入不是包名的目錄,那么你還需要用到package_dir參數。例如,如果在foobar 包中src 目錄擁有多個模塊:

<root>/ setup.py src/ __init__.py foo.py bar.py

合適的setup腳本將會是:

from distutils.core import setup setup(name='foobar', version='1.0', package_dir={'foobar': 'src'}, packages=['foobar'], )

例2.3 包發布(包存在於根目錄)

或者你想把包放在發布根目錄,如:

<root>/ setup.py __init__.py foo.py bar.py

這種情況下你的setu腳本將會是:

from distutils.core import setup setup(name='foobar', version='1.0', package_dir={'foobar': ''}, packages=['foobar'], )

(空字符串同樣也代表當前目錄)

例2.4 包發布(多子包)

如果你有多個子包,它們必須被顯在地列舉在packages參數中,但是其他任何在package_dir參數中的實體自動擴展到子包。(換句話說,Distutils並不瀏覽你的源文件樹(source tree),而是通過尋找__init__.py文件來計算相應Python包的目錄。)因此,如果默認的層次有一個子包:

<root>/ setup.py foobar/ __init__.py foo.py bar.py subfoo/ __init__.py blah.py

那么相應的setup腳本將會是:

from distutils.core import setup setup(name='foobar', version='1.0', packages=['foobar', 'foobar.subfoo'], )

注意:發布一個包,就是將該包所在目錄所有模塊全部發布。那么我們就不能只發布包內部分模塊。

例如,文件結構如下:

<root>/ setup.py sub_package1/ __init__.py sub_model1 sub_model2 sub_package2/ __init__.py sub_model3

使用Distutils,我們無法在發布包sub_packe1sub_package2的同時,不發布sub_model2模塊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM