2017-10-12 76 views
2

我有一個python應用程序(基於Django),我有幾個獨立的維護腳本與應用程序一起使用,我必須不時地調用它。他們必須導入我的應用程序的一部分(子包)。目前,我只是把它們放在我的頂層目錄:python應用程序中的腳本目錄的成語?

application/ 
    djangoproject/ 
    djangoapp/ 
    otherpackage/ 
    tool1.py 
    tool2.py 

tool1.py會做

from djangoproject import wsgi 
from djangoapp.models import Poll 

我已經積累了相當一些工具,並想將其移動到一個scripts子目錄。然後,我希望能夠通過python scripts/tool1.py或者cd scripts; python tool1.py給他們打電話。

我明白(有時候會哀嘆)Python的導入是如何工作的,而且我知道我可以在每個腳本中添加一些行來將父目錄添加到PYTHONPATH。我想知道是否有廣泛的模式來處理這樣的各種腳本集合。也許可以將路徑操作放到另一個文件中,並且每個腳本都以import mainproject開頭?

我正在使用virtualenv,並使用pip安裝依賴項。但是應用程序本身目前不使用setup.py,我認爲將腳本移動到通過pip安裝的單獨程序包是無濟於事的,因爲在開發過程中我經常對它們進行更改,並且有很多一次性操作。

+2

如果這些腳本正在爲您的django應用程序做些什麼,您可以考慮編寫[自定義管理命令](https://docs.djangoproject.com/en/1.11/howto/custom-management-commands/)。你也可以把這些腳本放在他們自己的package /目錄中,並將該目錄添加到你的venv激活腳本中的env PATH變量中。 – schwobaseggl

回答

1

組織源代碼的方法因項目而異。從我多年的經驗來看,最好的和最pythonic的方式是始終有setup.py

在這種情況下,您可以將pip install -e .editable version. dir虛擬安裝到virtualenv。其實,並沒有真正安裝(即複製),但「鏈接」:源代碼目錄將被添加到sys.path.pth文件,所以你可以編輯&嘗試沒有任何特殊的複製/安裝步驟。

更多相關內容,您可以通過將extra dependencies擴展爲例如開發目的,並通過pip install -e .[dev]安裝。更像是一種奇特的後果。

其餘取決於腳本的性質。


如果腳本是應用程序的一部分,則應通過entry-points in setup.py進行安裝。

# setup.py: 
setup(
    entry_points={ 
     'console_scripts': [ 
      'tool1 = mytools.tool1:main', 
      'tool2 = mytools.tool2:main', 
     ], 
    }, 
) 

在這種情況下,後pip install -e .,它們將在virtualenv中的bin文件夾,或在/usr/local/bin或類似物,如果系統蟒被使用。你可以這樣執行它們:

source .venv/bin/activate 
tool1 ... 

# OR: 

~/path/to/venv/bin/tool2 

腳本安裝這種方式充分了解virtualenv中,他們被安裝到,因此不需要激活,並沒有明確的蟒蛇二進制文件。


如果腳本是用於代碼維護,而不是應用程序的語義部分,然後它們通常在頂部(#!/usr/bin/env python)投入./scripts/目錄(或任何其他例如./ci/)中,用家當。例如,tool1.py

#!/usr/bin/env python 
def main(): 
    pass 
if __name__ == '__main__': 
    main() 

,並按如下當前的virtualenv由於這個家當執行:

source .venv/bin/activate 
./scripts/tool1.py ... 

# OR: 

~/path/to/venv/bin/python ./scripts/tool1.py 

與通過入口點安裝的腳本,這些腳本不知道在自己的virtualenv任何方式,所以virtualenv應該是激活或適當的python明確使用。

當腳本是非python的時候,例如,爲bash腳本。


在這兩種情況下,requirements.txt文件有時被用來應用程序的&依賴版本(與pip freeze),這樣的部署將持續&預測的。但這是另一個故事 - 關於應用程序的部署,而不是關於維護的包裝&。

requirements.txt文件經常重新生成以滿足setup.py中新的未固定(即靈活)要求和新的可用軟件包版本。但通常它是生成的內容(儘管在回購中承諾),而不是手動維護的內容。


如果嚴格不想有setup.py以任何理由,那麼無論用修改的環境變量執行這些腳本:

PYTHONPATH=. python scripts/tool1.py 

或者破解sys.path從裏面:

# tools1.py 
import sys 
import os 
sys.path.insert(0, os.path.dirname(os.path.dirname(__file__))) 

這正是pip install -e .所做的,只是在每次調用時手動完成,而不是在vi中使用.pth文件rtualenv。而且這看起來很黑。

但是,正如我們所知,無論是hacky解決方案還是重複解決方案,尤其是那些複製標準工具包的解決方案,都被認爲是「pythonic」。