2010-11-11 34 views
19

請出示簡單的和最新的標準方法來創建一個Python包的Python 2.x的如何創建一個Python 2.x的包 - 簡單的情況下

我寧願使用PIP安裝包後來。

包裝內應包含一個類:

class hello: 
    def greet(self): 
    print "hello" 

每個人都應該能夠做到後來如下:

pip install my_package-0.1.1.... 

,然後用它:

from my_package import hello 

h = hello.hello() 
h.greet() 

我我要求的是:

  • 目錄和文件佈局
  • 目錄中的文件的
  • 命令創建分發包文件
  • 命令(使用優選PIP)

有從分配包文件安裝包幾個HOWTO文檔,我發現,但我仍然不知道如何這個很簡單,剝離下來的情況下(沒有嵌套的包,清除了所有的文件和功能,可以爲最簡單的情況下可以省略)將被處理,這是現代的方式去做吧。

我想這個問題進入社會的維基狀態,這樣你就不會得到任何觀點,我將給予足夠的時間和將迎來幾天後接受了答案,也考慮到投票和評論。

編輯:

我有,我想與大家分享第一運行示例,我使用馬呂斯Gedminas的答案吧。它不包含一切,應該在那裏,但它的工作原理,所以它可以表明其在技術過程的核心。要添加更多必要的部件,請閱讀下面的Marius的答案。

目錄結構:

MyProject/ 
    setup.py 
    my_package.py 
    README.txt 
    MANIFEST.in 

setup.py:

from setuptools.import setup 
setup(name='MyProject', 
     version='0.1', 
     py_modules=['my_package']) 

my_package.py:

class hello: 
    def greet(self): 
    print "hello" 

MANIFEST.in:

include *.txt 

要創建該文件夾的包,進入該文件夾MyProject的,然後運行:

$ python setup.py sdist 

這將在一個子文件夾dist/創建一個文件MyProject-0.1.tar.gz。將此文件複製到目標機器上的文件夾。

在目標機器上含有MyProject-0.1.tar.gz的文件夾中運行此命令:

sudo pip install MyProject-0.1.tar.gz 

它可以是必要的註銷,現在重新登錄在目標機器上,所以包會被發現。之後,您可以使用Python殼在目標機器上測試軟件包:

$ python 
>>> import my_package 
>>> h = my_package.hello() 
>>> h.greet() 
hello 
>>> 

一旦這個作品,請記得添加其他必要的內容,請參見下面馬呂斯的回答。

+0

這個問題的關鍵是選擇一種現代化的方法,然後剝離幾乎所有可剝離的東西,以便它仍然有效。 – mit 2010-11-11 15:40:57

回答

32

開始簡單

簡單的一個文件包:

MyProject/ 
    setup.py 
    my_package.py 

最簡單setup.py:

from setuptools import setup 
setup(name='MyProject', 
     version='0.1', 
     author='Your Name', 
     author_email='[email protected]', 
     license='MIT', 
     description='Example package that says hello', 
     py_modules=['my_package']) 

包括包

接下來很可能需要添加一個額外的README文件:

MyProject/ 
    MANIFEST.in 
    README.rst 
    setup.py 
    my_package.py 

注意新的文件 - MANIFEST.in。它指定非Python文件應該被包含在源代碼分發:

include *.rst 

的人會告訴你:「哦,跳過清單,只需將文件添加到源代碼控制,setuptools的會發現它們」。忽略這個建議,它太容易出錯。

製作的PyPI頁有用

供人們在線查看,在Python包索引這使README.rst提供有用的。因此,改變你的setup.py做

from setuptools import setup 
with open('README.rst') as f: 
    readme = f.read() 
setup(name='MyProject', 
     ... 
     description='Example package that says hello', 
     long_description=readme, 
     ...) 

使用ReStructuredText標記爲漂亮的網頁。使用

python setup.py --long-description | rst2html 

可以儘早捕獲ReStructuredText錯誤。

更不是在一個包一個Python模塊

一個文件是不夠快,所以將其更改爲一個包(或者易混淆術語警告:與__init__ py Python包作爲一個目錄,而不是作爲一個分配自包含歸檔):

MyProject/ 
    MANIFEST.in 
    README.rst 
    setup.py 
    my_package/ 
     __init__.py 
     some_module.py 

,改變setup.py到

from setuptools import setup, find_packages 
with open('README.rst') as f: 
    readme = f.read() 
setup(name='MyProject', 
     version='0.2', 
     author='Your Name', 
     author_email='[email protected]', 
     license='MIT', 
     description='Example package that says hello', 
     long_description=readme, 
     packages=find_packages()) 

向市民公開

Get a PyPI account - 你只需要做一次。

要進行發佈,確保在setup.py版本號是否正確,然後運行

python setup.py sdist register upload 

就是這樣。

告訴人們安裝

告訴他們

pip install MyProject 

(同名您在setup.py指定爲name參數設置())

+2

我在這裏彎曲「最簡單」的問題。雖然我完全同意從簡單開始很重要,但最終你需要成長。當這種情況發生時,增長路徑應該清晰。 – 2010-11-11 17:35:02

+0

真是太神奇了,非常感謝! – mit 2010-11-11 17:36:14

+3

我認爲你已經在簡單和包括最重要的演員之間找到了一個很好的平衡點。 – mit 2010-11-11 17:43:48

4

以下內容從Distutils Tutorial複製而來。

文件佈局:

top 
|-- package 
| |-- __init__.py 
| |-- module.py 
| `-- things 
|  |-- cross.png 
|  |-- fplogo.png 
|  `-- tick.png 
|-- runner 
|-- MANIFEST.in 
|-- README 
`-- setup.py 

使安裝壓縮包,你只需運行:

python setup.py sdist 

要安裝該軟件包,使用pipeasy_install

pip install my_package-1.2.3.tar.bz2 

easy_install my_package-1.2.3.tar.bz2 

而且,你可以把它上傳到PyPI,先註冊吧:

python setup.py register 

然後上傳源碼包

python setup.py sdist upload 

您可以上傳二進制雞蛋以及(雖然不是必要的):

python setup.py bdist_egg upload 

然後人們可以像這樣安裝它:

pip install my_package==1.2.3 

,或者

easy_install my_package==1.2.3 
+0

@mit啊好吧;如果你想保持最低限度,'__import __('setuptools')。setup(name ='myapp')'就足夠了:) – 2010-11-11 15:53:59

+0

上傳bdist_eggs不僅是不必要的,而且可能是有害的。只有在爲Windows構建需要安裝C編譯器的包時才這樣做。 – 2010-11-11 17:04:49

+0

@Marius Gedminas請你引用雞蛋的危害性來源嗎?我沒有太多的使用它們,但是它們對於沒有安裝開發庫的人來說很有用(如果包有C擴展)。至於windows,'bdist_wininst'可能會更好,因爲它也像蛋一樣工作('easy_install'和'pip'可以解壓它們),但是也可以讓用戶通過GUI界面進行安裝。 – 2010-11-11 22:49:32

相關問題