2012-04-17 35 views
4

腳本使用zc.recipe.egg,我們<package>/bin/目錄是這樣的:如何在前面加上路徑的擴建,生成的腳本由<code>zc.buildout</code>產生

#! <python shebang> -S 

import sys 
sys.path[0:0] = [ 
    ... # some paths derived from the eggs 
    ... # some other paths included with zc.recipe.egg `extra-path` 
] 

# some user initialization code from zc.recipe.egg `initialization` 

# import function, call function 

我一直沒能爲找到一種方法來以編程方式前置在每個腳本中引入的sys.path構造的路徑。這可能嗎?

爲什麼:我有一個我的python項目安裝在全局版本,另一個版本在本地安裝(off-buildout tree)。我希望能夠在這兩個版本之間切換。

注:顯然,人們可以使用zc.recipe.egg/initialization屬性添加類似:

initialization = sys.path[0:0] = [ /add/path/to/my/eggs ] 

但是,有沒有其他辦法?一個例子的額外點!

+0

爲什麼你不能禁用本地安裝的路徑,以便全局安裝的版本被取代? – 2012-04-18 07:28:50

+0

這種情況是這樣的:我開發一些與CMake一起安裝的軟件。該軟件具有與C++代碼綁定的python。該軟件可以在我工作的機器上本地安裝。我可能需要簽出新版本的軟件,並針對新版本測試我的外部軟件包,反之亦然。 – 2012-04-18 08:27:12

回答

1

最後,我通過創建我自己的擴展配方來獲得工作環境,您可以在這裏找到:https://github.com/idiap/local.bob.recipe。包含配方的文件是這一個:https://github.com/idiap/local.bob.recipe/blob/master/config.py。在類構造器中有很多特定於我們軟件的檢查以及一些額外的改進,但不要爲此煩惱。 「真正的肉(TM)」是該類的install()方法。它是這樣或多或少的:

egg_link = os.path.join(self.buildout['buildout']['eggs-directory'], 'external-package.egg-link') 
f = open(egg_link, 'wt') 
f.write(self.options['install-directory'] + '\n') 
f.close() 
self.options.created(egg_link) 
return self.options.created() 

這將做到這一點。我的外部(基於CMake的)軟件包現在只需要創建與其構建的python軟件包並行的.egg-info文件。不是,我可以配合,使用上述的配方,特定的軟件包安裝像這樣的用法:

[buildout] 
parts = external_package python 
develop = . 
eggs = my_project 
     external_package 
     recipe.as.above 

[external_package] 
recipe = recipe.as.above:config 
install-directory = ../path/to/my/local/package/build 

[python] 
recipe = zc.recipe.egg 
interpreter = python 
eggs = ${buildout:eggs} 

如果你想切換裝置,只需更改上述install-directory財產。如果您希望使用系統範圍內的默認安裝,則只需從buildout.cfg文件中刪除recipe.as.above結構。 Buildout只需找到全局安裝而不需要任何額外的配置。卸載也將正常工作。所以,在構建之間切換隻會起作用。

這裏是一個完全工作的擴建.cfg文件,我們這裏使用方法:https://github.com/idiap/bob.project.example/blob/master/localbob.cfg

的問題是:是否有一個更簡單的方法來達到同樣的W/O具有這種外用配方?

0

那麼,你錯過的可能是最有用的擴建擴展,mr.developer。 通常情況下,我們假設foo.bar將會在一些回購中,比如說git。

你的擴建會像

[buildout] 
extensions = mr.developer 

[sources] 
foo.bar = git [email protected]:foo/foo.bar.git 

如果你沒有你的包在一個回購協議,則可以使用fs代替git,看看獲取細節。

激活「本地」版本由

./bin/develop a foo.bar 

停用完成由

./bin/develop d foo.bar 

有相當一些其他的東西,你可以用mr.developer做什麼,都去看看吧!

+0

不幸的是,mr.developer要求雞蛋採用原始格式,以便安裝包裝。在我們的例子中,軟件包已經安裝在某個地方(我們的軟件包是用CMake預製的,它也管理着其他的依賴關係)。從mr.developer的主頁,沒有明確的命令或選項集讓我說:「在這裏使用預先安裝的軟件包」。最終,我在尋找什麼。請注意,'zc.recipe.eggs'做了類似的事情,但不允許我將包目錄添加到搜索路徑中,只能追加。 – 2012-04-18 05:51:28