python入門-PyCharm中目錄directory與包package的區別及相關import詳解


一、概念介紹

在介紹目錄directory與包package的區別之前,先理解一個概念---模塊

模塊的定義:本質就是以.py結尾的python文件,模塊的目的是為了其他程序進行引用。

目錄(Dictionary):

Dictionary在pycharm中就是一個文件夾,放置資源文件,對應於在進行JavaWeb開發時用於放置css/js文件的目錄,或者說在進行物體識別時,用來存儲背景圖像的文件夾。該文件夾其中並不包含_ _ init.py_ _文件

包(Package):

對於Python package 文件夾而言,與Dictionary不同之處在於其會自動創建__init__.py文件。 
簡單的說,python package就是一個目錄,其中包括一組模塊和一個__init__.py文件。

 

二、導入模塊

導入模塊的方法:

import module_name
import module1_name,module2_name
from module_name import * ---> 一般import * 不建議使用
from module_name import m1,m2,m3  ---> m1為module_name下面的方法或變量
from module_name import logger as logger_a  ---> 為導入的變量或方法取個別名,引用時直接用別名

1.同級目錄下模塊的導入:

在main_day41.py中導入para_day41.py,兩種方法:

#方法一: 相當於把para_day41.py中的所有代碼拷貝過來賦值給變量para_day41,引用時直接用"該變量."
import
para_day41 para_day41.show_para()

運行結果:
D:\python365\python3.exe D:/Pyexample/20190220Day4/main_day41.py
in the para_day41
#方法二: 只把para_day41.py中name變量和show_para方法拷貝過來,可以直接用(推薦用該方法)
from
para_day41 import name,show_para print(name) show_para()

運行結果:
D:\python365\python3.exe D:/Pyexample/20190220Day4/main_day41.py
para_day41
in the para_day41

2.不同級目錄下模塊的導入:

(1)導入子目錄下的模塊

main.py中導入day51目錄下面para_day51.py

import day51.para_day51
day51.para_day51.show_para()
from day51.para_day51 import *
show_para()
from day51 import para_day51
para_day51.show_para()

運行結果:
D:\python365\python3.exe D:/Pyexample/20190220Day5/main.py
in the para_day51

(2)導入上級目錄下的模塊

day22目錄下面的main_day22.py導入day21目錄下的para_day21.py

注:執行main_day22.py時,要導入day21目錄下的para_day21.py,具體的搜索路徑是這樣的:

  首先,python需要在當前目錄下去找para_day21.py,發現沒有,然后就到sys.path列表中的每個路徑下面去找:

['D:\\Pyexample\\20190220Day2\\day22', 'D:\\Pyexample', 'D:\\Pyexample\\W3', 'D:\\Pyexample\\20181113', 'D:\\Pyexample\\CSP\\cspmonitor', 'D:\\Pyexample\\python', 'D:\\python365\\python36.zip', 'D:\\python365\\DLLs', 'D:\\python365\\lib', 'D:\\python365', 'D:\\python365\\lib\\site-packages']

  結果仍沒找到,所以就會報錯:

Traceback (most recent call last):
  File "D:/Pyexample/20190220Day2/day22/main_day22.py", line 21, in <module>
    import day21.para_day21
ModuleNotFoundError: No module named 'day21'

  解決辦法:需要手動將para_day21.py所在的父目錄或上上級目錄加到sys.path列表中,讓python可以搜索到即可

import sys,os
print(sys.path)

p = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  #獲取要導入模塊的上上級目錄 print(p)

sys.path.insert(0,p) #把獲取到的上上級目錄加到sys.path列表中 from day21 import para_day21
print(para_day21.name)
para_day21.show_para()

運行結果:
['D:\\Pyexample\\20190220Day2\\day22', 'D:\\Pyexample', 'D:\\Pyexample\\W3', 'D:\\Pyexample\\20181113', 'D:\\Pyexample\\CSP\\cspmonitor', 'D:\\Pyexample\\python', 'D:\\python365\\python36.zip', 'D:\\python365\\DLLs', 'D:\\python365\\lib', 'D:\\python365', 'D:\\python365\\lib\\site-packages']
D:\Pyexample\20190220Day2
['D:\\Pyexample\\20190220Day2', 'D:\\Pyexample\\20190220Day2\\day22', 'D:\\Pyexample', 'D:\\Pyexample\\W3', 'D:\\Pyexample\\20181113', 'D:\\Pyexample\\CSP\\cspmonitor', 'D:\\Pyexample\\python', 'D:\\python365\\python36.zip', 'D:\\python365\\DLLs', 'D:\\python365\\lib', 'D:\\python365', 'D:\\python365\\lib\\site-packages']
para_day21
in the para_day21

或者把要導入模塊的父目錄加到sys.path列表中

p = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + '\\day21'  #獲取要導入模塊的父目錄
sys.path.insert(0,p)
import para_day21
print(para_day21.name)
para_day21.show_para()

 

三、導入包

導入包的本質就是執行這個包下面的__init__.py文件

1.同級路徑下包的導入:

main.py中導入包day31,直接用import 包名即可

import day31

(1)__init__.py中沒有內容時

D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py

Process finished with exit code 0

(2)__init__.py中有內容時:

D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py
in the day31 __init__

Process finished with exit code 0

2.不同級路徑下包的導入:

前提:需要將要導入的包所在的路徑添加到sys.path列表中,方法同上,不再贅述。

3. 導入包中的模塊

只是導入一個包並沒有什么實際意義,包是用來從邏輯上組織模塊的,所以實際項目中更多的是導入包中的模塊,導入包中模塊的方法:

from Package1 import Module1
from Package1 import Package2
from Package1.Module1 import m1,m2 ---> m1,m2為模塊中的變量或方法
from Package1.Module1 import *
import Package1.Module1 import Package1.Package2

要導入的包及其模塊結構如下:

(1)在main.py中導入包day31下面的para_day31.py或者para_day32.py模塊

import day31.para_day31,day31.para_day32
day31.para_day31.show_para()
day31.para_day32.show_para()

運行結果:
D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py
in the day31 __init__
in the para_day31
in the para_day32

Process finished with exit code 0

或者:

from day31 import para_day31,para_day32
para_day31.show_para()
para_day32.show_para()

運行結果:
D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py
in the day31 __init__
in the para_day31
in the para_day32

Process finished with exit code 0

或者:

from day31.para_day31 import show_para,name
print(name)
show_para()

運行結果:
D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py
in the day31 __init__
para_day31
in the para_day31

Process finished with exit code 0

或者:

from day31.para_day31 import *
print(name)
show_para()

(2)在main.py中導入包day31下面所有的模塊,即全部導入

from day31 import *
para_day31.show_para()
para_day32.show_para()

運行結果:
D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py
in the day31 __init__
Traceback (most recent call last):
  File "D:/Pyexample/20190220Day3/main.py", line 35, in <module>
    para_day31.show_para()
NameError: name 'para_day31' is not defined

Process finished with exit code 1

此時,需要用到__init__.py文件中的__all__變量,在day31包中的__init__.py文件中定義如下:

"""
@Author:janson
@Date:2019/2/20
@File:__init__
"""

print("in the day31 __init__")

__all__ = ['para_day31','para_day32']

這時 from day31 import * 就會把注冊在包__init__.py 文件中 __all__ 列表中的子模塊和子包導入到當前作用域中來:

再次運行就不會報錯了:

from day31 import *
para_day31.show_para()
para_day32.show_para()

運行結果:
D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py
in the day31 __init__
in the para_day31
in the para_day32

Process finished with exit code 0

 


免責聲明!

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



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