原作:BRETT CANNON 譯者:豌豆花下貓@Python貓 英文:https:///the-many-ways-to-pass-code-to-python-from-the-terminal 大家好,歡迎來到 Crossin的編程教室 ! 我們通常運(yùn)行程序都是通過IDE里執(zhí)行運(yùn)行,有時(shí)候也會(huì)在命令行通過類似 python hello.py 運(yùn)行代碼。實(shí)際上,在命令行中運(yùn)行python程序還有一些其他的方法。這些方法主要運(yùn)用在服務(wù)器環(huán)境上。今天給大家分享一篇文章,來聊一聊你平常可能不會(huì)知道的python執(zhí)行方式。 python news ,它會(huì)將 Python 指向我們代碼中的'news'目錄。前幾天,一位合作者問這是如何工作的,似乎我們團(tuán)隊(duì)中的每個(gè)人都知道如何使用 這使我意識到其他人可能不知道有五花八門的方法可以將 Python 指向要執(zhí)行的代碼,因此有了這篇文章。 1、通過標(biāo)準(zhǔn)輸入和管道因?yàn)槿绾斡霉艿纻鳀|西給一個(gè)進(jìn)程是屬于 shell 的內(nèi)容,我不打算深入解釋。毋庸置疑,你可以將代碼傳遞到 Python 中。
如果將文件重定向到 Python,這顯然也可以。 # 重定向一個(gè)文件給 python 歸功于 Python 的 UNIX 傳統(tǒng),這些都不太令人感到意外。 2、通過 -c 指定的字符串如果你只需要快速地檢查某些內(nèi)容,則可以在命令行中將代碼作為字符串傳遞。
當(dāng)需要檢查僅一行或兩行代碼時(shí),我個(gè)人會(huì)使用它,而不是啟動(dòng) REPL(譯注:Read Eval Print Loop,即交互式解釋器,例如在 windows 控制臺中輸入 3、文件的路徑最眾所周知的傳代碼給 python 的方法很可能是通過文件路徑。 # 指定 python 的文件路徑 要實(shí)現(xiàn)這一點(diǎn)的關(guān)鍵是將包含該文件的目錄放到 4、對包使用 -m執(zhí)行 Python 包的正確方法是使用 -m 并指定要運(yùn)行的包名。
它在底層使用了runpy[5]。要在你的項(xiàng)目中做到這點(diǎn),只需要在包里指定一個(gè) 我知道有些人喜歡在一個(gè)包里寫一個(gè) from . import main 就我個(gè)人而言,我不感冒于單獨(dú)的 (譯注:即作者不關(guān)心作為入口文件的'main'或者“__main__”模塊,因?yàn)閳?zhí)行時(shí)只需用它們的包名即可。我認(rèn)為這也暗示了入口模塊不該再被其它模塊 import) 5、目錄定義 現(xiàn)在你可能會(huì)問:“為什么不直接指定文件路徑呢?”好吧,坦白說,關(guān)于文件路徑,有件事得說清楚。??在發(fā)布過程中,我可以簡單地寫上說明,讓運(yùn)行 再加上我以后可以更改文件名,而且沒人會(huì)注意到。再加上我知道代碼會(huì)帶有輔助文件,因此將其放在目錄中而不是單獨(dú)作為單個(gè)文件是有意義的。 當(dāng)然,我也可以將它變?yōu)橐粋€(gè)使用 -m 的包,但是沒必要,因?yàn)?announce 腳本很簡單,我知道它要保持成為一個(gè)單獨(dú)的自足的文件(少于 200 行,并且測試模塊也大約是相同的長度) 況且,
現(xiàn)在顯然必須要處理依賴關(guān)系,但是如果你的腳本僅使用標(biāo)準(zhǔn)庫或?qū)⒁蕾嚹K放在 (譯注:我覺得作者在此有點(diǎn)“炫技”了,因?yàn)檫@種寫法的前提是得知道 runpy 的用法,但是就像前一條所寫的用 -m 參數(shù)運(yùn)行一個(gè)包,在底層也是用了 runpy。不過炫技的好處也非常明顯,即 6、執(zhí)行一個(gè)壓縮文件如果你確實(shí)有多個(gè)文件和/或依賴模塊,并且希望將所有代碼作為一個(gè)單元發(fā)布,你可以用一個(gè) # 將一個(gè)壓縮包傳給 Python 人們現(xiàn)在習(xí)慣上用 .pyz 文件擴(kuò)展名來命名此類壓縮文件,但這純粹是傳統(tǒng),不會(huì)影響任何東西;你當(dāng)然也可以用 .zip 文件擴(kuò)展名。 為了簡化創(chuàng)建此類可執(zhí)行的壓縮文件,標(biāo)準(zhǔn)庫提供了zipapp[7]模塊。它會(huì)為你生成 不幸的是,僅當(dāng)壓縮文件包含的所有代碼都是純 Python 時(shí),才能這樣運(yùn)行壓縮文件。執(zhí)行壓縮文件對擴(kuò)展模塊無效(這就是為什么 setuptools 有一個(gè) zip_safe[8]標(biāo)志的原因)。(譯注:擴(kuò)展模塊 extension module,即 C/C 之類的非 Python 文件) 要加載擴(kuò)展模塊,Python 必須調(diào)用 dlopen()[9]函數(shù),它要傳入一個(gè)文件路徑,但當(dāng)該文件路徑就包含在壓縮文件內(nèi)時(shí),這顯然不起作用。 我知道至少有一個(gè)人與 glibc 團(tuán)隊(duì)交談過,關(guān)于支持將內(nèi)存緩沖區(qū)傳入壓縮文件,以便 Python 可以將擴(kuò)展模塊讀入內(nèi)存,并將其傳給壓縮文件,但是如果內(nèi)存為此服務(wù),glibc 團(tuán)隊(duì)并不同意。 但是,并非所有希望都喪失了!你可以使用諸如shiv[10]之類的項(xiàng)目,它會(huì)捆綁(bundle)你的代碼,然后提供一個(gè) |
|