2016-07-15 50 views
3

我剛剛完成了一個模塊並想打包它。我已閱讀文檔和此問題packaging a python application,但我不知道如何繼續,因爲我沒有導入包而是使用腳本來啓動。使用可執行文件打包Python庫

該項目看起來像:

Project/ 
|-- README 
|-- requirement.txt 
|-- driver.py 
|-- run.py 
|-- module_1 
| |-- __init__.py 
| |-- class_1.py 
| |-- class_2.py 
|-- module 2 
|-- |-- __init__.py 
|-- |-- class_1.py 
|-- |-- class_2.py 

爲了啓動該工具,我做的事:

python run.py arg1 --option arg2 

driver.py進口所有其它模塊和定義Driver類和一些功能。 run.py進口driver.py,解析參數,設置記錄器並逐個調用函數來完成這項工作。

我不確定setup.py的配置,我是否也需要根目錄下的全局__init__.py?據我所知,我只能做import Project不能用它的參數啓動腳本run.py

從其他讀物,也許我應該試着告訴Driver.py是包,並使用setup()entry_points選項。但我不明白如何正確地做到這一切。

謝謝你的幫助!

回答

1

通常,只有在整個項目適合單個模塊文件時,纔會將python包作爲模塊進行分發。如果您的項目比這更復雜,通常最好將您的項目作爲包含__init__.py文件的包。這裏是你的項目將是什麼樣子轉換爲包

Project/ 
|-- README 
|-- requirement.txt 
|-- setup.py 
|-- scripts/ 
| |-- driver.py 
|-- driver/ 
| |-- __init__.py 
| |-- module_1 
| | |-- __init__.py 
| | |-- class_1.py 
| | |-- class_2.py 
| |-- module_2 
| |-- |-- __init__.py 
| |-- |-- class_1.py 
| |-- |-- class_2.py 

我改名的run.pyscripts/driver.py,而您以前在driver.py的代碼現在driver/__init__.py

setup.py應該是這樣的

from setuptools import setup. find_packages 

setup(
    name='driver', 
    version='1.0', 
    packages=find_packages(), 
    scripts=['scripts/driver.py'], 
) 

這將複製scripts/driver.py到Python腳本目錄。我將run.py更名爲driver.py,因爲run非常通用,並且您希望腳本名稱具有唯一性,因爲所有Python包都共享相同的腳本位置。

或者,您可以使用console_scripts入口點。在這種情況下,您不會有單獨的scripts/driver.py腳本。相反,你只需要在你的包裏有一個函數。在這種情況下,您可以將scripts/driver.py中的所有代碼移動到driver/command_line.py,並將其置於名爲main()的函數中。然後改變你的setup.py這個

setup(
    name='driver', 
    version='1.0', 
    packages=find_packages(), 
    entry_points = { 
     'console_scripts': ['driver=driver.command_line:main'], 
    } 
) 

此外,你應該閱讀this docs page on python packaging。它涵蓋了基礎知識和很多常見用例。

+0

謝謝@Abel,這對我來說已經很清楚了!星期一工作吧!使用一種解決方案比另一種解決方案有什麼優勢?我猜首先看起來更清楚。 – Y0da

相關問題