[英]Is a Scripts directory an anti-pattern in Python? If so, what's the right way to import?
我總是在我構建的每個項目中創建腳本目錄,因為它們對於不經常使用的可執行腳本非常有用。 在Python中,我總是在我的腳本目錄中放置一個__init__.py
,這樣我就可以將腳本作為包運行(即python -m scripts.some_scripts
)並從姐妹目錄中加載模塊。 基於這個以及谷歌搜索,我開始覺得這是一個反模式。
那說,給定一個像這樣的結構:
project_dir/
some_modules_dir/
foo.py
bar.py
...
scripts/
some_script.py
other_script.py
...
什么是運行腳本的正確方法,以及從姐妹目錄some_modules_dir
導入腳本的正確方法是什么? 哪個dirs應該包含__init__.py
而哪些不應該包含? 我想盡可能地遵循PEP8,並希望盡可能簡化運行腳本。 如果擁有一個腳本目錄本身就是不可取的,那么你們又做了什么呢?
問題中的鏈接僅說明了運行位於包目錄中的腳本,這是一個潛在的問題,因為......好......包不是腳本而腳本不是包。 它們用於不同的目的,並以不同的方式調用,所以如果你把它們混合起來,那么在某些時候會有一些混亂。
由於Python 本身已經有了一個Scripts
目錄,並且沒有人抱怨,所以它絕不是反模式。
請參閱如何將可執行文件與庫文件分開? 關於我在上一次職業中處理可執行腳本的方式。 它從未引起我所知道的任何問題。
就個人而言,在一個腳本中有一個__init__.py
dir感覺有點偏 ,但我也可以看到它在這里(以及在IDE中)有用的原因。
也就是說,如果它們已經作為Python模塊運行,那么它們可能不是真正的腳本,無論是什么甚至意味着(相關:你對這些文件有什么想法嗎?)。 很難說沒有上下文,但也許他們更接近工具模塊,構成整個Python代碼庫的一部分。
在這種情況下,通過在項目級別添加__init__.py
. project_dir
(在您的示例中為project_dir
),您可以在您的可能腳本中使用常規導入:
from some_modules_dir import foo
意思是你原來的python -m scripts.some_script
讓我感覺絕對 (對不起)......
如果給它一個入口點列表(即main()
函數),Setuptools可以自動創建腳本 。 如果您已經在使用Setuptools,則很容易打開。 然后,您可以將scripts
目錄與其他包合並。
一般來說,如果你的Python項目包含多個項目原生的包,那么應該有一個頂級包,所有其他包都是子包(畢竟它們是同一個項目的一部分所以應該有一些統一其存在的理由)。 由於目錄僅在具有__init__.py
計為包,另一種說法是,如果項目中的任何兩個兄弟目錄都有__init__.py
,那么他們的父目錄也應該有一個__init__.py
。 因此,假設您有充分的理由在項目根目錄中直接使用“腳本”包和“模塊”包,您很可能擁有,項目根目錄也可能是一個包。
如果您的頂級包不是項目根目錄,那么通常認為在頂層包附近有一些“松散”的Python腳本。 像這樣:
project_root/
top_level_package/
__init__.py
module.py
subpackage/
__init__.py
anothermodule.py
adjacent_script.py
adjacent_script_2.py
“松散”腳本可以直接從包和模塊導入,因為它們與頂級包位於同一目錄中。 這種結構的假設是頂級軟件包包含項目的所有“有趣”代碼(如果需要,您的“賣點”或項目的“肉”),而“松散”相鄰腳本僅起作用作為您可能想要從頂級包訪問的特定功能的入口點。 例如,您可能有一個相鄰的腳本用於啟動測試套件,安裝軟件,或者如果您的項目是應用程序,則啟動應用程序。
關於您的特定模式,我的印象是您將“腳本”與“模塊”區分開來,因為腳本是您和模塊之間的接口。 如果它只是作為開發人員,並且您不經常使用“腳本”,正如您所說,只要根目錄具有__init__.py
,就可以堅持使用您的配方。 但是,如果您(或其他人)也將“腳本” 用作最終用戶 ,或者您經常使用它們,那么提供一個與頂級包相鄰的腳本更為貼心,該腳本捆綁了“腳本”中的功能“單個命令中的目錄(或者如果它們提供非常不同的功能,可能是一些命令),每個”腳本“的子命令。 您可能希望將argparse標准模塊用於該相鄰腳本。 在任何一種情況下,調用“腳本” 工具可能更合適。
如果您只有幾個工具,並且它們不包含除命令行和模塊之間的粘合之外的任何代碼,您也可以考慮將它們移動到頂層目錄。
一些來源:
setup.py
腳本也是相鄰腳本的一個示例)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.