[python]自問自答:python -m參數? (轉)


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、相當於import,叫做當做模塊來啟動

不同的加載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解釋器會在這些目錄下去尋找依賴的庫!
注解一點:''——為當前目錄(linux中是.
***

下面有兩個例子,通過不同方式啟動同一文件,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.cnblogs.com/xueweihan/p/5118222.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM