2014-03-03 50 views
7

我在我的當前目錄C:\test中有一個python腳本foo.py爲什麼使用-m選項調用模塊將sys.path [0]設置爲空字符串?

這是代碼。

import sys 
print('sys.path:', sys.path) 
print('sys.argv:', sys.argv) 

當我將它作爲腳本執行時,我看到了這個輸出。

C:\test>python foo.py 
sys.path: ['C:\\test', 'C:\\Windows\\system32\\python34.zip', 'C:\\Python34\\DLLs', 'C:\\Python34\\lib', 'C:\\Python34', 'C:\\Python34\\lib\\site-packages'] 
sys.argv: ['foo.py'] 

但是,當我作爲一個模塊執行它,我看到這個輸出。

C:\test>python -m foo 
sys.path: ['', 'C:\\Windows\\system32\\python34.zip', 'C:\\Python34\\DLLs', 'C:\\Python34\\lib', 'C:\\Python34', 'C:\\Python34\\lib\\site-packages'] 
sys.argv: ['C:\\test\\foo.py'] 

爲什麼sys.path[0]在我作爲模塊執行程序時變成了空字符串?

http://docs.python.org/3.4/library/sys.html#sys.path的文檔中提到的:

如在程序啓動時,該列表的第一項, 路徑初始化[0],是含有用來 調用的Python腳本的目錄翻譯。如果腳本目錄不是 可用(例如,如果解釋器是交互式調用的,或者 腳本是從標準輸入讀取的),則path [0]是空字符串, 指示Python首先搜索當前目錄中的模塊。

因此,如果腳本目錄不可用,那麼只能假設將sys.path[0]設置爲''。但在我的情況下,即使執行python -m foo,腳本目錄foo顯然是可用的。所以它不應該根據文檔設置sys.path[0]''。相反,它應該將其設置爲'C:\\test'

它是文檔中的錯誤還是Python解釋器中的錯誤或我理解中的錯誤?

+0

你從哪裏看到空串?在這兩種情況下,'sys.path'都有一個*非空*第一個元素。區別在於它是否包含完整或相對路徑。 – Bakuriu

+0

@Bakuriu你在哪裏看到一個非空的第一個元素?您在此輸出中看不到空字符串:'sys.path:['','C:\\ Windows \\ system32 \\ python34.zip','C:\\ Python34 \\ DLLs','C :\\ Python34 \\ lib','C:\\ Python34','C:\\ Python34 \\ lib \\ site-packages']'? –

+0

Touchè。讀取輸出時,我誤讀了'sys.path'的'sys.argv'。 – Bakuriu

回答

7

看什麼man python說,關於-m:爲指定的模塊

-m module-name

搜索sys.path並運行相應的.py文件爲腳本。

如果你想想看,這是沒有意義的添加包含.py文件的目錄中碰到sys.path,因爲它已經在那裏擺在首位被發現。所以,國際海事組織的行爲是正確的。

但是文檔說如果它作爲腳本運行,則包含它的目錄應該被預置爲sys.path。我會說,它是文檔中的錯誤,它應該說:

[...](例如,如果解釋交互式的調用,或者如果腳本是從標準輸入或者如果腳本讀取運行使用-m選項)[...]

+0

這是什麼意思的人,我如何將其安裝到開始菜單? – Cuadue

+0

@Cuadue:'man'是閱讀手冊頁的標準Unix命令。你只需要去一個終端並運行命令'man '。如果你不知道它,可能你正在運行一個不像Unix的系統,比如Windows,在那裏你沒有一個簡單的選擇。對於Python,至少你有集成的幫助文件。對於其他一切......你有互聯網!要了解它是什麼樣的,請訪問[Linux手冊頁](https://www.kernel.org/doc/man-pages/)。 – rodrigo

+0

如果您認爲文檔應該改進;你可以[提交文檔補丁](http://docs.python.org/devguide/docquality.html) – jfs

相關問題