組織源代碼的方法因項目而異。從我多年的經驗來看,最好的和最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」。
如果這些腳本正在爲您的django應用程序做些什麼,您可以考慮編寫[自定義管理命令](https://docs.djangoproject.com/en/1.11/howto/custom-management-commands/)。你也可以把這些腳本放在他們自己的package /目錄中,並將該目錄添加到你的venv激活腳本中的env PATH變量中。 – schwobaseggl