2013-08-16 41 views
2

我的包依賴於最新版本的jsonpickle包。舊版本可以通過pip安裝,但我需要最新版本(即在Github上)才能正常工作。在這種情況下,通常認爲在我的代碼中捆綁了最新版本的jsonpickle?有其他解決方案嗎?我寧願不要求我的用戶不要從github克隆。Python包導入子包 - 良好的做​​法?

我想整理我的包是這樣的:

My package 
    | 
__init__.py 
file1.py 
file2.py 
      \ 
     jsonpickle (latest) 

即做什麼在這裏做:Python: importing a sub‑package or sub‑module

+1

如果你只是想避免讓人們git克隆和手動構建和安裝,pip安裝git + https://github.com/foo/bar透明地包裝所有這一切。這是一個可接受的臨時解決方案(直到他們更新PyPI)? – abarnert

+0

最後,我用@ abarnet的解決方案 - 這只是一個臨時解決方案,我所有的測試似乎都通過了。與此同時,我會嘗試和bug的jsonpickle球員上傳他們的最新版本到pypi。 –

回答

3

由於KAG說,這通常不是一個好主意。這不是因爲對其他軟件包不友好而「被折磨」,而是它對您和您的用戶造成的維護負擔。 (想象一下在​​中修復了一個影響你的用戶的bug,但是你還沒有找到修復的方法,如果你正常完成了所有的事情,他們只需要升級​​,但是如果你使用一個內部副本,他們必須下載​​源和你的,破解你的包,並手動安裝。)

有時,它仍然值得去做。例如,非常受歡迎的requests模塊包括its own copy的其他包,如urllib3。是的,它確實面臨着上述兩個成本。但是這也意味着每個版本的request都可以依賴urllib3的確切特定版本。由於requests大量使用urllib3的很少使用的接口,甚至有一些已知錯誤的解決方法,這可能是有價值的。

就你而言,這聽起來不像是問題。您只需要臨時版本​​,直到上游維護人員將新版本上傳到PyPI。問題不在於你不希望你的用戶擁有不同的版本;這是你不想強迫他們克隆回購,並找出如何手動安裝它。幸運的是,pip需要照顧,對你,通過包裹最困難起來一行:

pip install git+https://github.com/foo/bar 

這不是一個漂亮的解決方案,但它只是暫時的,對不對?

2

它一般是捆綁與您的項目的一些相關性最好的主意。有些項目無論如何都是這樣做的,或者如果沒有可用的系統軟件包,則將它捆綁爲一個替代品。 (這主要在C項目中找到,而不是Python中)

你沒有提到「最新」的意思。這是pypi的最新版本嗎?

確保安裝包的特定版本(或基線版本)的最佳方法是在setup.py中正確指定需求部分。閱讀更多關於這裏需要[1]。通過這種方式,pip可以解決依賴問題,如果可以在pypi中使用,它將會自動執行。

[1] http://docs.python.org/2/distutils/setupscript.html#relationships-between-distributions-and-packages

+0

我完全同意它通常是最好的避免,但在這種情況下,我相當卡住 - 最新的意思是最新的github上,pypi的版本太舊了。我已經聯繫了開發者關於更新它,但同時我需要一個解決方案。 –

+1

實際上,Python並不罕見。例如,非常受歡迎的['requests'](http://docs.python-requests.org/en/latest/)模塊包含[自己的副本](https://github.com/kennethreitz/requests/tree/master/requests/packages)的其他軟件包,如['urllib3'](http://urllib3.readthedocs.org/en/latest/)。你說得對,最好避免它,但有些情況你不能。 – abarnert

+0

我同意可能會出現一些無法避免的情況,但通常情況下通常不會這樣做。你知道爲什麼要求嗎?也許他們有一個很好的理由(比如它是一個特別補丁的版本),但是我不記得我已經從源代碼構建的許多python包做過。我認爲這可以歸因於python有一個事實上的存儲庫。 C項目發現它的原因是,C社區沒有pypi等價物。 – kag