python模塊包調用問題

1.不同目錄下函數調用

A

   |----- __init__.py

   |-----  a.py

   |---------B

         |--------- __init__.py

         |---------b.py

   |---------C

         |--------- __init__.py

         |--------c.py

如圖所示結構樹,B,C同屬於A的子目錄,但是B,C之間是平行的。。。

b.py,c.py代碼分別如下:

b.py:

def b_hello():
    print "B_HELLO"

c.py:

def c_hello():
    print "C_HELLO"

如果A中a.py要調用B中或者C中py,則可以如下方式調用(以B爲例)

from B import b

b.b_hello()

運行結果:B_HELLO

但是如果是B中或者C中py調用B中或C中呢?

這個時候如果我們依舊用如上所說調用,則會報錯(這裏是b.py調用c.py)

>>>

Traceback (most recent call last):
  File "E:\testnow\A\B\b.py", line 1, in <module>
    from C import c
ImportError: No module named C

所以,這種方法不行,那如何做呢,如下

import sys
sys.path.append('E:\\testnow\\A\\C')
import c
def b_hello():
    print "B_HELLO"
c.c_hello()

用這種方法,輸出結果是:C_HELLO

也即剛纔上面的“from 文件夾 import 模塊名”只適用於父目錄調用子目錄的情況。。。而第二種方法則對所有的情況都適用,包括兩個模塊甚至都不在一個盤的情況。。。這裏需要注意的一點是:sys.path添加目錄時注意是在windows還是在linux下,windows下需要‘\\’否則會出錯。。。。。。。(我在這點上走了很久的彎路。。。)

 

2.同目錄下函數調用

包是一個分層次的文件目錄結構,它定義了一個由模塊及子包,和子包下的子包等組成的 Python 的應用環境。

簡單來說,包就是文件夾,但該文件夾下必須存在 __init__.py 文件, 該文件的內容可以爲空。__init__.py 用於標識當前文件夾是一個包。

考慮一個在 package_runoob 目錄下的 runoob1.py、runoob2.py、__init__.py 文件,test.py 爲測試調用包的代碼,目錄結構如下:

test.py
package_runoob
|-- __init__.py
|-- runoob1.py
|-- runoob2.py

源代碼如下:

package_runoob/runoob1.py

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
def runoob1():
   print "I'm in runoob1"

package_runoob/runoob2.py

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
def runoob2():
   print "I'm in runoob2"

現在,在 package_runoob 目錄下創建 __init__.py

package_runoob/__init__.py

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
if __name__ == '__main__':
    print '作爲主程序運行'
else:
    print 'package_runoob 初始化'

然後我們在 package_runoob 同級目錄下創建 test.py 來調用 package_runoob 包

test.py

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
# 導入 Phone 包
from package_runoob.runoob1 import runoob1
from package_runoob.runoob2 import runoob2
 
runoob1()
runoob2()

以上實例輸出結果:

package_runoob 初始化
I'm in runoob1
I'm in runoob2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章