1. 程式人生 > 程式設計 >Python -m引數原理及使用方法解析

Python -m引數原理及使用方法解析

python -m xxx.py

作用是:把xxx.py檔案當做模組啟動

但是我一直不明白當做模組啟動到底有什麼用。python xxx.py和python -m xxx.py有什麼區別!

自問自答:

python xxx.py
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',...]
# 以模組方式啟動:python -m run.py
test_import_project git:(master) ✗ python -m run.py
['',

*** 細心的同學會發現,區別就是在第一行。

直接啟動是把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
['',...]

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

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

匯入一個叫 mod1 的模組時,直譯器先在當前目錄中搜索名為 mod1.py 的檔案。如果沒有找到的話,接著會到 sys.path 變數中給出的目錄列表中查詢。 sys.path 變數的初始值來自如下:

  • 輸入指令碼的目錄(當前目錄)。
  • 環境變數 PYTHONPATH 表示的目錄列表中搜索(這和 shell 變數 PATH 具有一樣的語法,即一系列目錄名的列表)。
  • Python 預設安裝路徑中搜索。
  • 實際上,直譯器由 sys.path 變數指定的路徑目錄搜尋模組,該變數初始化時預設包含了輸入指令碼(或者當前目錄), PYTHONPATH 和安裝目錄。這樣就允許 Python程式瞭解如何修改或替換模組搜尋目錄。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。