我是新來的Python(和編程一樣),雖然有據可查的,我不明白究竟意味着-m指令(恰恰在創建虛擬環境:python3 -m venv my_env
使用「-m」選項「將庫模塊作爲腳本運行」意味着什麼?
至於我可以從文檔中看到,它代表「運行庫模塊作爲腳本」:事實上這個概念我無法弄清楚,在沒有-m
的情況下運行命令有什麼區別。
此外,它這是Python 3的一個特性?
我是新來的Python(和編程一樣),雖然有據可查的,我不明白究竟意味着-m指令(恰恰在創建虛擬環境:python3 -m venv my_env
使用「-m」選項「將庫模塊作爲腳本運行」意味着什麼?
至於我可以從文檔中看到,它代表「運行庫模塊作爲腳本」:事實上這個概念我無法弄清楚,在沒有-m
的情況下運行命令有什麼區別。
此外,它這是Python 3的一個特性?
Python模塊只是位於Python可以找到它們的位置的腳本文件。與所有腳本一樣,只要知道它們的位置,就可以直接運行它們,例如python /path/to/module.py
。
正確設計的模塊通常不會做任何事情,除了設置的東西(例如,您可以導入的函數和類型),但它們通常不會有任何可見的副作用。這就是爲什麼你可以做import sys
而沒有任何反應。
但是,某些模塊在從命令行運行時可能會提供有用的內容。這方面的例子包括venv
,還有http.server
或idlelib
:所有這些都是常規模塊,可以從其他模塊導入,無副作用。
但是當直接執行它們時,它們都會執行某些操作(例如,venv
設置虛擬環境,http.server
運行簡單的HTTP服務器,idlelib
運行IDLE)。這通常與以下檢查完成:
if __name__ == '__main__':
print('Module is being executed directly, so do stuff here')
這是被直接執行的腳本/模塊的識別的一種特殊方式,還是它只是被從其他模塊導入。您可以詳細瞭解「What does if __name__ == '__main__':
do?」這個問題。
因此,您可以使用我們之前建立的python /path/to/module.py
直接運行模塊。但是這需要你知道模塊的完整路徑。這就是-m
選項的作用:對於通常只需使用import modulename
即可導入的模塊,可以使用python -m modulename
直接運行該模塊。就像你輸入完整的路徑一樣。
所以對於我們上面的例子,我們可以使用python -m venv
,python -m http.server
。或python -m idlelib
。
這不是python3的屬性,在模塊的情況下需要使用-m腳本。說,例如你有文件夾結構這樣
|-HelloModule
|_ __init__.py
|_ hellomodule.py
|_ first_script.py
現在,如果使用的是任何類別或功能或first_script.py成hellomodule.py任何對象,那麼你必須運行hellomodule.py作爲模塊指命令將改爲
python -m HelloModule/hellomodule
,你必須從HelloModule目錄外運行此命令。
文檔是你的朋友:https://docs.python.org/3.5/using/cmdline。html#cmdoption -m – freakish
您已閱讀[documentation](https://docs.python.org/using/cmdline.html#cmdoption-m)?只是問,因爲你說這是有據可查的,但沒有鏈接到「文件」。 – MSeifert