2014-12-03 22 views
5

我在同一個目錄中的兩個文件,並在任何地方沒有__init__.py文件:這個Python導入如何工作?

c:\work\test>tree 
. 
|-- a 
| `-- a 
|  |-- a1.py 
|  `-- a2.py 
`-- b 

一個文件導入另:

c:\work\test>type a\a\a1.py 
print 'a1-start' 
import a2 
print 'a1-end' 

c:\work\test>type a\a\a2.py 
print 'a2' 

的導入成功,即使從一個完全不同的位置運行:

c:\work\test\b>python ..\a\a\a1.py 
a1-start 
a2 
a1-end 

我跑

c:\work\test>python -V 
Python 2.7.3 

和我的PYTHONPATH和PYTHONHOME變量未設置

c:\work\test>echo %PYTHONPATH% %PYTHONHOME% 
%PYTHONPATH% %PYTHONHOME% 

如何a1.py找到a2

+0

我會哈扎德猜測,如PHP,Python的將評估多個位置查找文件,包括當前的工作目錄? – 2014-12-03 15:55:21

+0

當前工作目錄是'測試\ B' ... – thebjorn 2014-12-03 15:57:38

+0

該腳本運行從一個,但是,原諒我缺乏Python的知識,但PHP和我相信大多數語言會同樣對待這種情況,當你鍵入..這只是改變該腳本的工作目錄 – 2014-12-03 15:59:55

回答

8

module docs(重點煤礦)引述:

「當一個名爲垃圾郵件導入模塊,用於解釋首先搜索內置有該名稱模塊如果沒有找到,則查找一個。文件名爲spam.py由變量給定的sys.path目錄的列表的sys.path從這些位置初始化:。

  • 包含輸入腳本(或當前目錄)的目錄
  • PYTHONPATH(清單目錄名,與shell變量PATH語法相同)。
  • 安裝相關的默認。」
+0

啊,我感到困惑,因爲我沒有在'sys.path'中的任何地方看到'test \ a \ a'的引用(它以'['','c:\\ python27 \\ lib開始。 ')。 – thebjorn 2014-12-03 16:07:54

+0

@thebjorn:''''指代ofrommel的答案的粗體部分。參見['sys.path'](https://docs.python.org/3/library/sys.html#sys.path)。 – Kevin 2014-12-03 17:06:32