2016-07-02 33 views
3

我想寫我的第一個python模塊,可以很容易地分佈和安裝在不同的機器上(希望通過克隆存儲庫並運行setup.py)。問題是我的模塊依賴於一個小的二進制文件;我使用Selenium模塊作爲我的依賴項之一,它需要Chrome瀏覽器的驅動程序(http://chromedriver.storage.googleapis.com/index.html?path=2.22/)。在python模塊中包含一個二進制文件,這是不是很好的做法?

我想要做的是在我的回購中包含不同的二進制文件,讓python確定系統平臺,選擇正確的二進制文件,將其添加到系統路徑,然後像平常一樣安裝模塊。

這很容易嗎?更重要的是,這實際上是一種好的做法還是有更好的選擇?這似乎是一個非常惱人的事情,必須單獨下載二進制文件,並將其添加到每臺機器的系統路徑,我想運行我的模塊,但我寧願不違背慣例。

+3

你的二進制文件是特定於解釋器的,並且在模塊中包含任何二進制文件都不是一個好主意 - 相反,你的egg和setup.py應該完成版本,依賴項和複製文件的工作。 http://stackoverflow.com/questions/2026395/how-to-create-python-egg-file – dmitryro

+0

感謝您的迴應德米特羅!所以如果我理解你的話,我的setup.py文件應該確定需要哪個文件並直接下載它,而不是在源文件中包含所有的二進制文件以開始?我真的不知道該怎麼去做... –

+1

是的。您將提供它們的列表和它們的版本,它們將被複制 - 請參閱https://pythonhosted.org/an_example_pypi_project/setuptools.html – dmitryro

回答

1

基於ivan_pozdeev和dmitryro的意見,這是解決方案,我想出了目前的樣子:

在我的項目目錄中的文件夾斌/與子linux32鏡像/,LINUX64 /,mac32 /的Win32 /。每個子文件夾內都有相應的可執行文件(chromedriver/cromedriver.exe)。

我加入以下行到我的setup.py腳本:

import platform 

# Determine the correct platform for the webdriver 
system = platform.system() 
arch, _ = platform.architecture() 
if system == 'Linux': 
    if arch == '64bit': 
     webdriver = 'bin/linux64/chromedriver' 
    else: 
     webdriver = 'bin/linux32/chromedriver' 
if system == 'Windows': 
    webdriver = 'bin/win32/chromedriver.exe' 
if system == 'Darwin': 
    webdriver = 'bin/mac32/chromedriver' 

然後,在調用設置()函數,我只需添加關鍵字參數

scripts=[webdriver], 

後一些簡單的測試,這似乎將正確的可執行文件複製到系統的路徑並正常安裝python模塊。

相關問題