成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

漲見識了,在終端執(zhí)行 Python 代碼的 6 種方式!

開發(fā) 后端
為了我們推出的 VS Code 的 Python 插件 [1],我寫了一個簡單的腳本來生成變更日志 [2](類似于Towncrier [3],但簡單些,支持 Markdown,符合我們的需求)。在發(fā)布過程中,有一個步驟是運行python news ,它會將 Python 指向我們代碼中的"news"目錄。

 為了我們推出的 VS Code 的 Python 插件[1],我寫了一個簡單的腳本來生成變更日志[2](類似于Towncrier[3],但簡單些,支持 Markdown,符合我們的需求)。在發(fā)布過程中,有一個步驟是運行python news,它會將 Python 指向我們代碼中的"news"目錄。

[[329218]]

前幾天,一位合作者問這是如何工作的,似乎我們團隊中的每個人都知道如何使用-m?請參閱我的有關帶 -m 使用 pip 的文章[4],了解原因。

這使我意識到其他人可能不知道有五花八門的方法可以將 Python 指向要執(zhí)行的代碼,因此有了這篇文章。

1、通過標準輸入和管道

因為如何用管道傳東西給一個進程是屬于 shell 的內容,我不打算深入解釋。毋庸置疑,你可以將代碼傳遞到 Python 中。

 

  1. # 管道傳內容給 python 
  2. echo "print('hi')" | python 

如果將文件重定向到 Python,這顯然也可以。

  1. # 重定向一個文件給 python 
  2. python < spam.py 

歸功于 Python 的 UNIX 傳統(tǒng),這些都不太令人感到意外。

2、通過 -c 指定的字符串

如果你只需要快速地檢查某些內容,則可以在命令行中將代碼作為字符串傳遞。

 

  1. # 使用 python 的 -c 參數(shù) 
  2. python -c "print('hi')" 

當需要檢查僅一行或兩行代碼時,我個人會使用它,而不是啟動 REPL(譯注:Read Eval Print Loop,即交互式解釋器,例如在 windows 控制臺中輸入python, 就會進入交互式解釋器。-c 參數(shù)用法可以省去進入解釋器界面的過程)

3、文件的路徑

最眾所周知的傳代碼給 python 的方法很可能是通過文件路徑。

 

  1. # 指定 python 的文件路徑 
  2. python spam.py 

要實現(xiàn)這一點的關鍵是將包含該文件的目錄放到sys.path里。這樣你的所有導入都可以繼續(xù)使用。但這也是為什么你不能/不應該傳入包含在一個包里的模塊路徑。因為sys.path可能不包含該包的目錄,因此所有的導入將相對于與你預期的包不同的目錄。

4、對包使用 -m

執(zhí)行 Python 包的正確方法是使用 -m 并指定要運行的包名。

 

  1. python -m spam 

它在底層使用了runpy[5]。要在你的項目中做到這點,只需要在包里指定一個__main__.py文件,它將被當成__main__執(zhí)行。而且子模塊可以像任何其它模塊一樣導入,因此你可以對其進行各種測試。

我知道有些人喜歡在一個包里寫一個main子模塊,然后將其__main__.py寫成:

 

  1. from . import main 
  2.  
  3. if __name__ == "__main__"
  4.     main.main() 

就我個人而言,我不感冒于單獨的main模塊,而是直接將所有相關的代碼放入__main__.py,因為我感覺這些模塊名是多余的。

(譯注:即作者不關心作為入口文件的"main"或者“__main__”模塊,因為執(zhí)行時只需用它們的包名即可。我認為這也暗示了入口模塊不該再被其它模塊 import。我上篇文章 [6]比作者的觀點激進,認為連那句 if 語句都不該寫。)

5、目錄

定義__main__.py也可以擴展到目錄。如果你看一下促成此博客文章的示例,python news可執(zhí)行,就是因為 news 目錄有一個 __main__.py 文件。該目錄就像一個文件路徑被 Python 執(zhí)行了。

 

 

 

 

現(xiàn)在你可能會問:“為什么不直接指定文件路徑呢?”好吧,坦白說,關于文件路徑,有件事得說清楚。😄在發(fā)布過程中,我可以簡單地寫上說明,讓運行python news/announce.py,但是并沒有確切的理由說明這種機制何時存在。

再加上我以后可以更改文件名,而且沒人會注意到。再加上我知道代碼會帶有輔助文件,因此將其放在目錄中而不是單獨作為單個文件是有意義的。

當然,我也可以將它變?yōu)橐粋€使用 -m 的包,但是沒必要,因為 announce 腳本很簡單,我知道它要保持成為一個單獨的自足的文件(少于 200 行,并且測試模塊也大約是相同的長度)

況且,__main__.py文件非常簡單。

 

  1. import runpy 
  2. # Change 'announce' to whatever module you want to run. 
  3. runpy.run_module('announce', run_name='__main__', alter_sys=True

現(xiàn)在顯然必須要處理依賴關系,但是如果你的腳本僅使用標準庫或將依賴模塊放在__main__.py旁邊(譯注:即同級目錄),那么就足夠了!

(譯注:我覺得作者在此有點“炫技”了,因為這種寫法的前提是得知道 runpy 的用法,但是就像前一條所寫的用 -m 參數(shù)運行一個包,在底層也是用了 runpy。不過炫技的好處也非常明顯,即__main__.py 里不用導入 announce 模塊,還是以它為主模塊執(zhí)行,也就不會破壞原來的依賴導入關系)

6、執(zhí)行一個壓縮文件

如果你確實有多個文件和/或依賴模塊,并且希望將所有代碼作為一個單元發(fā)布,你可以用一個__main__.py,放置在一個壓縮文件中,并把壓縮文件所在目錄放在 sys.path 里,Python 會替你運行__main__.py文件。

 

  1. # 將一個壓縮包傳給 Python 
  2. python app.pyz 

人們現(xiàn)在習慣上用 .pyz 文件擴展名來命名此類壓縮文件,但這純粹是傳統(tǒng),不會影響任何東西;你當然也可以用 .zip 文件擴展名。

為了簡化創(chuàng)建此類可執(zhí)行的壓縮文件,標準庫提供了zipapp[7]模塊。它會為你生成__main__.py并添加一條組織行(shebang line),因此你甚至不需要指定 python,如果你不想在 UNIX 上指定它的話。如果你想移動一堆純 Python 代碼,這是一種不錯的方法。

不幸的是,僅當壓縮文件包含的所有代碼都是純 Python 時,才能這樣運行壓縮文件。執(zhí)行壓縮文件對擴展模塊無效(這就是為什么 setuptools 有一個 zip_safe[8]標志的原因)。(譯注:擴展模塊 extension module,即 C/C++ 之類的非 Python 文件)

要加載擴展模塊,Python 必須調用 dlopen()[9]函數(shù),它要傳入一個文件路徑,但當該文件路徑就包含在壓縮文件內時,這顯然不起作用。

我知道至少有一個人與 glibc 團隊交談過,關于支持將內存緩沖區(qū)傳入壓縮文件,以便 Python 可以將擴展模塊讀入內存,并將其傳給壓縮文件,但是如果內存為此服務,glibc 團隊并不同意。

但是,并非所有希望都喪失了!你可以使用諸如shiv[10]之類的項目,它會捆綁(bundle)你的代碼,然后提供一個__main__.py來處理壓縮文件的提取、緩存,然后為你執(zhí)行代碼。盡管不如純 Python 解決方案理想,但它確實可行,并且在這種情況下算得上是優(yōu)雅的。

 

責任編輯:華軒 來源: Python貓
相關推薦

2021-04-16 10:45:02

SQLJava函數(shù)

2021-03-07 16:41:06

URLSpring5

2020-11-04 09:52:16

Python讀取圖片開發(fā)

2024-07-26 10:47:10

2020-04-20 22:34:11

農業(yè)物聯(lián)網IOT

2020-08-20 07:38:51

Java字符串整形

2020-01-21 21:31:31

物聯(lián)網IOT物聯(lián)網應用

2020-07-14 08:17:26

代碼執(zhí)行時間

2020-06-22 13:43:46

代碼編碼語言

2018-09-29 11:00:58

2018-05-30 13:58:02

Linux進程通信

2020-02-06 10:10:24

python程序代碼

2020-01-14 07:33:24

動物生活物聯(lián)網IOT

2021-05-17 22:40:25

微信功能技巧

2022-10-18 10:41:44

Flowable服務任務

2024-01-17 13:56:00

Redis節(jié)點映射關系

2018-07-03 14:00:44

Linux終端script命令

2020-05-25 10:32:05

云安全云計算

2023-08-26 07:09:36

2019-07-30 07:05:37

物聯(lián)網商業(yè)模式IOT
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕欧美在线观看 | 亚洲精品国产一区 | 久久精品国产99国产 | 日韩精品一区二区三区 | 天天干 夜夜操 | 亚洲精品一区二区三区中文字幕 | 高清国产一区二区 | 综合在线视频 | 色婷婷亚洲一区二区三区 | 国产精品久久国产精品 | 亚洲欧美一区二区三区视频 | 狠狠久 | 久久免费视频观看 | 午夜精品久久久久久久99黑人 | 日韩在线免费 | 密乳av| 色综合视频 | 亚洲一区二区三区桃乃木香奈 | 色天天综合 | 在线亚洲免费 | 毛片在线看片 | 日日干夜夜草 | 天天色影视综合 | 久久99久久98精品免观看软件 | 亚洲 中文 欧美 日韩 在线观看 | 日韩在线观看视频一区 | 成人h动漫亚洲一区二区 | 久久国产精品亚洲 | 精品在线免费观看视频 | 久久人人爽人人爽 | 欧美a∨| 欧美精品乱码久久久久久按摩 | 午夜影视 | 91久久北条麻妃一区二区三区 | 亚洲人精品午夜 | av一区二区三区在线观看 | 永久av| 99福利视频 | av中文字幕在线 | 亚洲福利一区 | 亚洲天堂av一区 |