2011-09-30 67 views
77

你能向我解釋有什麼區別調用-m開關的用途是什麼?

python -m mymod1 mymod2.py args 

python mymod1.py mymod2.py args 

似乎在這兩種情況下mymod1.py被調用,sys.argv之間是

['mymod1.py', 'mymod2.py', 'args'] 

那麼是什麼-m切換爲?

+0

如果我錯了,請糾正我,但'-m'似乎在默認庫路徑中搜索'mymod1'。例如:'python -m SimpleHTTPServer'起作用,而'python SimpleHTTPServer'失敗,'無法打開'SimpleHTTPServer'文件:[Errno 2]沒有這樣的文件或目錄。 – Basj

+1

我其實在這裏找到了更清晰的答案:https://stackoverflow.com/questions/46319694/what-does-it-mean-to-run-library-module-as-a-script-with-the-m-option – Casebash

回答

74

PEP 338Rationale的部分的第一行表示:

Python 2.4中添加命令行開關-m以允許模塊使用用於執行作爲腳本Python模塊命名空間來定位。激勵的例子是標準的庫模塊,如pdb和profile,Python 2.4的實現對於這個有限的目的是很好的。

所以你可以在Python的搜索路徑中以這種方式指定任何模塊,而不僅僅是當前目錄中的文件。你是正確的,python mymod1.py mymod2.py args具有完全相同的效果。 Scope of this proposal部分的第一行指出:

在Python 2.4中,使用-m命令執行的模塊就像在命令行中提供它的文件名一樣。

隨着-m更多的是可能的,如使用模塊是一個包的一部分,等等。這就是PEP 338的其餘部分。閱讀更多信息。

+31

我最喜歡'-m'的用法是'python -m SimpleHTTPServer'。當我需要共享某些文件而不使用USB閃存驅動器時非常方便。 – arifwn

+6

@arifwn運行Python3需要稍微更新爲'python -m http.server',這仍然很棒! –

+7

TL; DR:1)您可以運行'python -m package.subpackage.module'並使用正常的解析機制,您不必指出確切的'.py'文件。 2)可以從運行的模塊執行相關導入,而不需要任何解決方法,因爲它的包將一路裝載。 3)絕對導入將基於您當前的目錄,而不是'.py'文件所在的目錄(''''位於'sys.path'的頭部,而不是'/ path/to/my',如果腳本位於'/ path/to/my/script.py')。 – clacke