2013-03-27 57 views
0

我有這樣的目錄結構:我可以使用requirements.txt文件來處理本地python目錄嗎?

src/ 
--scripts/ 
----foo/a.py 
----bar/b.py 
--lib1 
--lib2 
--lib3 

的目的,如果有腳本/富/和腳本/酒吧/可運的Python腳本,利用模塊在LIB1的目錄,LIB2, LIB3。在活動開發中,腳本lib1,lib2和lib3都是獨立的內部git存儲庫。沒有一個靜態接口或發佈版本依賴。基本上,他們幾乎在同一時間由一個小團隊編寫。

我玩過lib [1-3]子模塊,我真的很討厭這個工作流程。我想我想要的是能夠從foo/a.py中執行「import lib1」,並讓它使用lib1中的當前代碼。一旦成熟,我們可能會對所有東西進行版本化,並致力於生產適當的包。

這樣做的一種方法是在每個腳本中使用sys.path以明確查看'../../'或其他內容。我想知道是否有更優雅的東西。我可以得到像pip install -r requirements.txt這樣的工作嗎?我不想做一個官方的pypi setup.py,我只想得到一個指向lib [1-3]目錄的當前內容的指針。我喜歡requirements.txt方法的原因是,隨着庫的成熟,我最終會將版本和git URL放在那裏。

或者,有沒有完全不同的方式來做到這一點?

回答

2

從常規意義上的確實一個Git倉庫安裝模塊需要setup.py,但它可以是一個最低限度的一個,而不是更全面的一個像你的PyPI將模塊使用。例如:

#!/usr/bin/env python 

from distutils.core import setup 

setup(
    name="foo", 
) 

如果你把類似的東西,您的每一個LIB庫,那麼你可以讓你的需求文件點用-e git://git.example.com/foo.git#egg=foo git的回購協議。如果你將它安裝到virtualenv中,那麼它將出現在virtualenv目錄中的src/foo,並且當從該virtualenv運行Python時它將自動添加到sys.path

-e選項也接受本地目錄作爲參數,因此,如果你能保證的是,當前的工作目錄將永遠是你的項目的根當你從requirements.txt安裝(這樣的相對路徑解析正確),它應該工作只要在那裏寫入-e lib1這樣的東西,然後你仍然可以引用庫作爲git子模塊,如果你想。

如果你有決心創建setup.py那麼你的任務是運行python setup.py develop時仿效會發生什麼。這條命令做了兩件事(像Python 2.7的,至少):

  • 它創建在你的virtualenv的site-packages lib目錄的egg link(或系統範圍內的,如果你沒有的virtualenv)指向您的目標源目錄。
  • 它添加一行到easy-install.pth,該行也在site-packages目錄中,該目錄也指向您的目標源目錄。

你可以選擇通過比運行setup.py editable其他手段,以做到既上述行動,並得到爲Python的當前版本相同的效果,當然,編輯發行的實現可以在Python的新版本改變。

+0

如果我沒有使用virtualenv,它將在哪裏安裝? – kbyrd 2013-03-29 18:25:04

+0

如果你從git repo安裝,按照我的經驗'pip'會在當前工作目錄下創建一個'src'目錄。我不確定這是故意的還是隻是由於未設置'VIRTUAL_ENV'環境變量而導致的錯誤。如果你從一個本地目錄安裝,那麼它只會嘗試將egg鏈接和'pth'文件寫入系統範圍的'site-packages'目錄,其絕對路徑指向你指定的本地目錄。 – 2013-03-29 18:44:55

相關問題