2008-11-30 111 views
2

我在想如何安排這將有位於/ usr/bin中/一部署Python應用程序共享包

  1. 可執行腳本,這將提供一個命令行界面的功能在
  2. 實施的部署Python應用程序
  3. 將庫安裝到當前站點包目錄所在的位置。

現在,現在,我在我的源目錄結構如下:

foo.py 
foo/ 
    __init__.py 
    ... 

我的猜測是不是做事情的最好方法。在開發過程中,一切都按預期工作,但是當部署時,foo.py中的「from foo import FooObject」代碼似乎嘗試導入foo.py本身,這不是我正在尋找的行爲。

所以,問題是什麼是策劃這樣的情況下的標準做法?我能想到的一個事情是,在安裝時,將foo.py重命名爲foo,這會阻止它自動導入,但這看起來很尷尬......

我想這個問題的另一部分是這是一個命名挑戰。也許調用可執行腳本foo-bin.py?

+0

這不一樣.. http://stackoverflow.com/questions/17893/whats-the-best-way-to-distribute-python-command-line-tools – dbr 2008-11-30 07:52:25

回答

5

This article很不錯,並且向你展示了一個很好的方法。從做的第二項列表回答你的問題。

無恥的複製粘貼:

通過Jp Calderone

做一個Python項目的

文件系統結構:

  • 將該目錄命名爲與您的項目相關的內容。例如,如果您的 項目名爲「Twisted」,請將 頂級目錄命名爲其源 文件Twisted。當您執行發行版時,您應該包含版本號 後綴:Twisted-2.5
  • 創建一個目錄Twisted/bin並把你的可執行文件存在,如果你有 有任何。不要給他們一個.py 擴展名,即使他們是Python 源文件。不要在 中放置任何代碼,除了在項目中導入並呼叫 主函數定義的其他地方 。
  • 如果您的項目可作爲單個Python源文件表達,則將其 放入該目錄中,並將其命名爲 與您的項目相關的內容。例如, 例如,Twisted/twisted.py。如果您需要多個源文件,請創建一個 包(Twisted/twisted/, 和空 Twisted/twisted/__init__.py),並將 源文件放入其中。例如, Twisted/twisted/internet.py
  • 把你的單元測試在程序包中的子包(注 - 這意味着 ,單一Python源文件 選項上面是一招 - 你總是 需要您 單元測試至少一種其他文件)。例如, Twisted/twisted/test/。當然,製作 它與 Twisted/twisted/test/__init__.py包。 在 Twisted/twisted/test/test_internet.py等文件中放置測試。
  • add Twisted/README and Twisted/setup.py to explain and 分別安裝你的軟件, 如果你感覺不錯。

不要:

  • 把你的源在一個名爲srclib目錄。這使得難以運行 而無需安裝。
  • 把你的測試放到你的Python包之外。這使得 難以針對已安裝的 版本運行測試。
  • 創建一個僅包含__init__.py的包,然後將所有代碼放入__init__.py。只需製作一個模塊 而不是一個包,它更簡單。
  • 嘗試拿出神奇的黑客,才能使Python能夠導入模塊 或包,而無需用戶添加 包含它的目錄,以他們的 導入路徑(無論是通過PYTHONPATH或 一些其他的機制)。您不會 正確處理所有情況,並且當您的 軟件不能在其環境中工作時,用戶 會對您生氣。

+0

這是好東西,我會用它,但我也想在Windows上工作。從Python文件中刪除'.py'擴展名在那裏似乎不太可行。我錯過了什麼嗎?你的安裝過程會把它們放回去,還是把它們包裹起來? – 2009-07-19 15:33:34

0

你應該調用可執行程序只是foo,不foo.py,然後嘗試導入foo將不會使用它。

至於命名正確:這是很難回答的抽象;我們需要知道它具體做了什麼。例如,如果它配置和控制,調用它-config或ctl可能是合適的。如果它是該庫的shell API,則它應該與該庫具有相同的名稱。

+0

目錄被命名爲foo,所以這顯然不起作用。次好的是bin/foo,但是你必須用sys.path來找到你的包目錄。 – Rhamphoryncus 2009-05-29 05:02:05

2

Distutils支持安裝模塊,包和腳本。如果創建的distutils setup.py是指foo作爲包裝和foo.py爲腳本,然後foo.py應該得到安裝/usr/local/bin或任何相應的腳本安裝路徑是目標操作系統上,而foo包應該得到安裝到site_packages目錄。

0

您的CLI模塊是一回事,支持它的包是另一回事。不要混淆的名稱枝條模塊foo(在文件foo.py)和封裝foo(在目錄foo與文件__init__.py)。

你有兩件事情名爲foo:模塊和一個包。你還想要什麼名字foo?一類?一個函數?一個變量?

爲Foo模塊或foo軟件包選擇一個獨特的名字。例如,foolib是一個流行的軟件包名稱。