Python的-m參數【用法解析】

python -m

1、在命令行中啓動Python腳本的時候,經常會用到-m參數,那麼-m起了什麼作用呢?

2、先看看 python --help 給出的信息:

run library module as a script (terminates option list)

意思是將庫中的python模塊用作腳本去運行。

3、常用例子

python -m SimpleHTTPServer    #python2中啓動一個簡單的http服務器
python -m http.server    #python3中啓動一個簡單的http服務器

所以在python27當中我們可以使用python -m pip等做一些操作

python -m xxx.py

作用是:把xxx.py文件當做模塊啓動
但是我一直不明白當做模塊啓動到底有什麼用。python xxx.py和python -m xxx.py有什麼區別!

自問自答:

  1. python xxx.py
  2. python -m xxx.py

這是兩種加載py文件的方式:
1叫做直接運行
2把模塊當作腳本來啓動(注意:但是__name__的值爲'main' )

不同的加載py文件的方式,主要是影響——sys.path 這個屬性。sys.path 就相當於liunx中的PATH。

下面來看一下sys.path

>>> import sys
>>> sys.path
['', '/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',  
...]

上面的內容我只截取了一段。此爲當前python解釋器運行的環境,python解釋器會在這些目錄下去尋找依賴的庫!
註解一點:‘’——爲當前目錄
***

下面有兩個例子,通過不同方式啓動同一文件,sys.path屬性的值有何不同。

# run.py 內容如下
import sys
print(sys.path)

# 直接啓動:python run.py
test_import_project git:(master) ✗ python run.py
['/Users/sx/Documents/note/test_py/test_import_project',  
 '/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',  
  ...]
# 以模塊方式啓動:python -m run.py
test_import_project git:(master) ✗ python -m run.py
['',  
 '/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',

*** 細心的同學會發現,區別就是在第一行。
直接啓動是把run.py文件,所在的目錄放到了sys.path屬性中。
模塊啓動是把你輸入命令的目錄(也就是當前路徑),放到了sys.path屬性中***


在工作場景中有什麼用呢?

# 目錄結構如下
package/
    __init__.py
    mod1.py
package2/
    __init__.py
    run.py  
# run.py 內容如下
import sys
from package import mod1
print(sys.path)

如何才能啓動run.py文件?

# 直接啓動(失敗)
➜  test_import_project git:(master) ✗ python package2/run.py
Traceback (most recent call last):
  File "package2/run.py", line 2, in <module>
    from package import mod1
ImportError: No module named package

# 以模塊方式啓動(成功)
➜  test_import_project git:(master) ✗ python -m package2.run
['',
'/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
...]

當需要啓動的py文件引用了一個模塊。你需要注意:在啓動的時候需要考慮sys.path中有沒有你import的模塊的路徑!
這個時候,到底是使用直接啓動,還是以模塊的啓動?目的就是把import的那個模塊的路徑放到sys.path中。你是不是明白了呢?

官方文檔參考: http://www.pythondoc.com/pythontutorial3/modules.html

導入一個叫 mod1 的模塊時,解釋器先在當前目錄中搜索名爲 mod1.py 的文件。如果沒有找到的話,接着會到 sys.path 變量中給出的目錄列表中查找。 sys.path 變量的初始值來自如下:

  1. 輸入腳本的目錄(當前目錄)。
  2. 環境變量 PYTHONPATH 表示的目錄列表中搜索(這和 shell 變量 PATH 具有一樣的語法,即一系列目錄名的列表)。
  3. Python 默認安裝路徑中搜索。
    實際上,解釋器由 sys.path 變量指定的路徑目錄搜索模塊,該變量初始化時默認包含了輸入腳本(或者當前目錄), PYTHONPATH 和安裝目錄。這樣就允許 Python程序瞭解如何修改或替換模塊搜索目錄。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章