2015-05-11 60 views
1

當我使用pip從源代碼安裝軟件包時,它會生成軟件包的版本號,我可以使用'pip show'來查看。但我找不到如何生成該版本號,並且無法從源代碼中找到版本字符串。有人能告訴我該版本是如何生成的嗎?pip如何確定python軟件包版本

回答

2

pip使用的版本號來自setup.py(如果你pip install文件,目錄,回購等)和/或指數的PyPI的信息(如果你pip install包名)。 (因爲這兩者必須完全相同,所以它們並不重要)

建議軟件包在運行時在其頂級模塊/軟件包上使用相同的字符串作爲__version__屬性,在他們的設置中,但這不是必需的,並不是每個軟件包都會這樣做。

如果軟件包沒有公開它的版本,那麼你真的沒辦法得到它。 (好吧,除非你想的grub通過pip數據,試圖找出哪些軟件包擁有一個模塊,然後得到其版本)


下面是一個例子:

在源代碼bs4( BeautifulSoup4),該setup.py文件中有這樣一行:

version = "4.3.2", 

就是這樣被使用時,直接或間接地,通過pip版本。

然後,裏面bs4/__init__.py,有這樣一行:

__version__ = "4.3.2" 

這意味着,倫納德·理查森是一個好人誰如下的建議,這樣我就可以import bs4; print(bs4.__version__)並得到相同的版本字符串pip show beautifulsoup4給我。

但是,正如您所看到的,它們是完全不同文件中的兩個完全不同的字符串。如果他不好,他們可能完全不同,或者第二個可能會失蹤,或者命名不同。


的OpenStack的人想出了一個名爲PBR一個漂亮的圖書館,可以幫助您管理的版本號。您可以閱讀鏈接的文檔頁面以獲取完整的詳細信息,但基本思路是它可以從git中爲您生成整個版本號,或者驗證您指定的版本號(在setup.cfgmetadata部分中)並附加dev構建數字出git。 (這依賴於您在git回購庫中使用Semantic Versioning。)

+0

謝謝您的回答。我很好奇版本字符串的其餘部分來自哪裏。例如,openstack cinder在setup.cfg中有version = 2014.2(https://github.com/openstack/cinder/blob/master/setup.cfg)。在pip安裝-e〜/ cinder之後,其在pip中的版本顯示爲2014.2.0.0b4.dev83。我想知道'.0.0b4.dev83'是怎麼來的。 – tvbinstinct

+0

@tvbinstinct我相信所有的OpenStack項目都使用[PBR](https://pypi.python.org/pypi/pbr/)來管理版本號,並且它會嘗試從DVCS回購中提取版本信息版本和標籤附加到指定的版本號,但我不太確定;我從來沒有閱讀過文檔,也沒有用它來看看它在做什麼。 – abarnert

+0

@tvbinstinct:啊哈,找到了。讓我更新全部細節的答案。 – abarnert