2009-10-19 65 views
5

我們有一個我們正在開發的python庫。在開發過程中,我想使用該庫的某些部分來測試它的較新版本。也就是說,使用穩定的代碼來測試開發代碼。有什麼辦法在Python中做到這一點?在同一個過程中使用不同版本的python庫

編輯:更具體地說,我們有一個庫(LibA),它有很多有用的東西。另外,我們有一個使用LibA的測試庫來提供一些測試工具(LibT)。我們想要使用LibT來測試LibA,但是因爲LibT依賴於LibA,所以我們寧願它在測試LibT時使用穩定版本的LibA(因爲我們只會在測試通過時才更改LibT以使用更新的LibA)。因此,在運行單元測試時,LibA-dev測試將使用依賴於LibA-stable的LibT代碼。

我們想到的一個想法是在不同的進程上使用RPyC調用穩定的代碼,但是要以一種不透明的方式實現它很棘手(確保它正確地死掉等等,並允許多個實例在同一臺計算機上的同一時間等)。

感謝

+1

爲什麼不能使用普通的源代碼管理工具來構建穩定和開發代碼的所需配置?其他人都在SVN中使用分支。並沒有編程。爲什麼你不能使用SVN分支來做到這一點? – 2009-10-19 10:21:41

+1

看不到分支與此有關,所以我提出了一個更清晰的問題,希望它能幫助你理解我正在嘗試做的事情。 – abyx 2009-10-19 11:09:22

回答

0

我不確定你到底需要如何設置你的測試,但你可以使用VirtualEnv靠上海誓山盟運行的兩個實例。

+0

這不是一方,實際上需要使用另一方。 – abyx 2009-10-19 11:04:23

1

如果您使用依賴於libA(穩定)的libT來「測試」libA-dev,那麼您並不真正在測試libA-dev,因爲它會在生產環境中運行。真正測試libA-dev的唯一方法就是全力以赴,並使libT依賴於libA-dev。如果這打破了你的單元測試,那麼這是一件好事 - 它向你展示了需要修復的東西。

如果你沒有單元測試,那麼這是開始製作它們的時候了(首先使用穩定的libA和libT!)。

我推薦使用「版本控制系統」(例如bzr,hg,svn,git)。然後你可以製作你的項目的分支,「stable」和「devA」。

要在分支DEVA工作,你會首先運行

export PYTHONPATH=/path/to/devA 

通過確保PYTHONPATH環境變量不包括其他部門,你放心Python是隻使用你想要的模塊。

當需要從dev - > stable合併代碼時,版本控制軟件將提供一個簡單的方法來實現。

版本控制還可以讓你變得更大膽 - 嘗試重大更改並不是可怕的。如果事情沒有解決,恢復是非常容易的。在這和PYTHONPATH技巧之間,你總是能夠回到已知的工作代碼。

如果您覺得上述只是不適合您,並且您必須使用libT-which-depends-on-libA來測試libA-dev,那麼您需要重命名所有模塊並修改所有的import語句在libA-dev和libA之間做了明確的分離。例如,如果libA有一個名爲moduleA.py的模塊,則將其重命名爲moduleA_dev.py。

命令

rename -n 's/^(.*)\.py/$1_dev.py/' *.py 

將 「_dev」 添加到所有的* .py文件。 (使用「-n」標誌,重命名命令只會顯示你想要的重命名,刪除「-n」以實際完成它。)

要恢復的重命名,運行

rename -n 's/^(.*)_dev\.py/$1.py/' *.py 

下一步,你需要將所有的引用moduleA到moduleA_dev代碼中。命令

find /path/to/LibA-dev/ -type f -name '*.py' -exec sed -i 's/moduleA/moduleA_dev/g' {} \; 

將改變LibA-dev中的每個* .py文件,改變「moduleA」 - >「moduleA_dev」。

請小心使用此命令。這很危險,因爲如果你有一個叫做moduleAB的變量,那麼它將被重命名爲moduleA_devB,而你真正想要的可能是moduleAB_dev。

爲了一旦分離的命名空間還原此變化(受上述警告),

find /path/to/LibA-dev/ -type f -name '*.py' -exec sed -i 's/moduleA_dev/moduleA/g' {} \; 

,你已經打破的循環依賴關係。一旦你滿意你的libA-dev是好的,你可以改變moduleA_dev.py - > moduleA.py並且 在代碼中改變對moduleA_dev - > moduleA的所有引用。

+0

但是他們是不同的項目,LibAT有什麼意義? LibT想要使用穩定版本的LibA,就是這樣。我從來不想在其他代碼中使用LibT的開發版本,只有穩定的LibT和穩定的LibA才能測試dev-LibA – abyx 2009-10-19 12:38:07

+0

我已經編輯了我的答案,希望能更好地解決您的情況。 – unutbu 2009-10-19 16:36:23

1

「我們想用LIBT測試力霸,但由於LIBT取決於力霸,我們寧願它使用力霸的穩定版本,在測試LIBT」

這是沒有意義的,使用T + A來測試A.有意義的是以下內容。

LibA真的是兩件東西混合在一起:A1和A2。

T取決於A1。

實際情況是,您使用T和A1來升級和測試A2。

如果將LibA分解爲T需要的部分和其他部分,則可能能夠打破此循環依賴關係。

相關問題