由於上一篇有用到 module 今天就來看一下 module 是什麼,module 基本上就是一個檔案.而 module 名稱使用小寫,所以前一篇有自定義了一個 myCaculate 模組也就是 my_caculate.py
這檔案.而模組裡可以定義變數、function 或 class.my_caculate.py
total_amt = 0
def add(a,b):
return a + b
def _sum(a,b):
return a + b
class CusCounter:
def count(self,num):
return num + 1
如果要使用 my_caculate 模組只需要 import 進來就可以使用 module 提供的屬性、類別和函式.
import my_caculate
>>> counter = my_caculate.CusCounter()
>>> counter.count(1)
2
>>> print(my_caculate.total_amt)
0
>>> my_caculate.add(2,3)
5
>>> my_caculate._sum(10,11)
21
module import 進來了但在使用時都要在前面加上 module name.所以可以用另一種方式 from ... import ....這樣就不用加上 module name 了.
>>> from my_caculate import *
>>> counter = CusCounter()
>>> counter.count(1)
2
>>> add(2,3)
5
>>> _sum(10,11)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name '_sum' is not defined
但 import *
之前有提過 _
開頭的就不會被 import 進來了,要直接 import 該名稱.可是 my_caculate 之前已經 import 過了,如果想要區別的話可以使用 as 別名,取代原本的名稱.
>>> from my_caculate import _sum as my_sum
>>> my_sum(1,2)
3
>>> add(2,3)
5
module 是檔案,所以用來分類的 package 就是目錄了.把上面建立的my_caculate.py
搬到一個目錄底下calc/util
,為了告訴 python calc 是 package 要在 calc 目錄底下加上 __init__.py
,裡面可以先不寫東西,但檔案一定要在.不然 python 會說 calc 不是 package.
calc
__init__.py
-util
my_caculate.py
接著在 calc 同一層的目錄底下執行 python3,再把 calc.util package 底下的 my_caculate import 進來.
>>> from calc.util.my_caculate import *
>>> add(2,3)
5
定義 PYTHONPATH 可以告訴 python 要去哪裡找 libraries.
> PYTHONPATH=/Volumes/Transcend/pylearn python3
Python 3.7.4 (v3.7.4:e09359112e, Jul 8 2019, 14:54:52)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import calc.util.my_caculate
>>> counter = calc.util.my_caculate.CusCounter()
>>> counter.count(1)
2
使用 sys.path 可以看到所有會去找 library 的路徑.
>>> import sys
>>> sys.path
['', '/Volumes/Transcend/pylearn', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages']
如果一開始沒給 PYTHONPATH 如果臨時想要增加 library 路徑的話,可以透過 sys.path.append
可以達到一樣的效果.
> python3
Python 3.7.4 (v3.7.4:e09359112e, Jul 8 2019, 14:54:52)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import calc.util.my_caculate
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'calc'
>>> import sys
>>> sys.path.append('/Volumes/Transcend/pylearn')
>>> import calc.util.my_caculate
>>> counter = calc.util.my_caculate.CusCounter()
>>> counter.count(1)
2
如果想要知道使用 module 的實際路徑可透過__file__
找到.
>>> calc.util.my_caculate.__file__
'/Volumes/Transcend/pylearn/calc/util/my_caculate.py'
但只限於在 python 實作的 library,像 sys 就沒辦法這樣使用.
>>> sys.__file__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'sys' has no attribute '__file__'