2017-09-20 33 views
2

我是新來的Python(和編程一樣),雖然有據可查的,我不明白究竟意味着-m指令(恰恰在創建虛擬環境:python3 -m venv my_env使用「-m」選項「將庫模塊作爲腳本運行」意味着什麼?

至於我可以從文檔中看到,它代表「運行庫模塊作爲腳本」:事實上這個概念我無法弄清楚,在沒有-m的情況下運行命令有什麼區別。

此外,它這是Python 3的一個特性?

+0

文檔是你的朋友:https://docs.python.org/3.5/using/cmdline。html#cmdoption -m – freakish

+0

您已閱讀[documentation](https://docs.python.org/using/cmdline.html#cmdoption-m)?只是問,因爲你說這是有據可查的,但沒有鏈接到「文件」。 – MSeifert

回答

8

Python模塊只是位於Python可以找到它們的位置的腳本文件。與所有腳本一樣,只要知道它們的位置,就可以直接運行它們,例如python /path/to/module.py

正確設計的模塊通常不會做任何事情,除了設置的東西(例如,您可以導入的函數和類型),但它們通常不會有任何可見的副作用。這就是爲什麼你可以做import sys而沒有任何反應。

但是,某些模塊在從命令行運行時可能會提供有用的內容。這方面的例子包括venv,還有http.serveridlelib:所有這些都是常規模塊,可以從其他模塊導入,無副作用。

但是當直接執行它們時,它們都會執行某些操作(例如,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

1

這不是python3的屬性,在模塊的情況下需要使用-m腳本。說,例如你有文件夾結構這樣

|-HelloModule 
    |_ __init__.py 
    |_ hellomodule.py 
|_ first_script.py 

現在,如果使用的是任何類別或功能或first_script.py成hellomodule.py任何對象,那麼你必須運行hellomodule.py作爲模塊指命令將改爲

python -m HelloModule/hellomodule

,你必須從HelloModule目錄外運行此命令。