成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

模塊、包-創(chuàng)新互聯(lián)

1.模塊

1.1模塊定義

在Python中,一個.py文件就稱為一個模塊。

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的靈石網(wǎng)站設(shè)計(jì)、移動媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

1.2使用模塊的好處

大的好處是提高了代碼的可維護(hù)性。其次,編寫代碼不必從零開始。當(dāng)一個模塊編寫完成,就可以被其他地方引用。我們在編寫程序的時候,也經(jīng)常引用其他模塊,包括Python內(nèi)置的模塊和第三方的模塊。
使用模塊可以避免函數(shù)名和變量名的沖突。每個模塊有獨(dú)立的命名空間,因此相同名字的函數(shù)和變量完全可以分別存在不同的模塊中,所以,我們在編寫模塊時,不必考慮名字會和其他模塊沖突。

1.3模塊分類

模塊分為三種:
內(nèi)置標(biāo)準(zhǔn)模塊(又稱標(biāo)準(zhǔn)庫)執(zhí)行help('modules')查看所有python自帶模塊列表,如os,sys等等
第三方開源模塊,可通過pip install模塊名 聯(lián)網(wǎng)安裝
自定義模塊

1.4模塊調(diào)用

import module
from module import xx
from module.xx.xx import xx as rename  
from module.xx.xx import *
"注意:模塊一旦被調(diào)用,即相當(dāng)于執(zhí)行了另外一個py文件里的代碼"

1.5自定義模塊

創(chuàng)建一個.py文件,就可以稱為模塊,就可以在另外一個程序中導(dǎo)入

1.6模塊查找路徑

我們會發(fā)現(xiàn),自己寫的模塊只能在當(dāng)前路徑下的程序中才能導(dǎo)入,換一個目錄再導(dǎo)入自己的模塊就報(bào)錯說找不到了,這主要是與導(dǎo)入路徑有關(guān)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
import sys
print(sys.path)

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
['E:\\PythonProject\\python-test\\BasicGrammer', 'E:\\PythonProject\\python-test\\BasicGrammer', 'D:\\software\\pycharm\\install\\PyCharm 2019.1.1\\helpers\\pycharm_display', 'E:\\PythonProject\\python-test\\venvP3\\Scripts\\python36.zip', 'D:\\software2\\Python3\\install\\DLLs', 'D:\\software2\\Python3\\install\\lib', 'D:\\software2\\Python3\\install', 'E:\\PythonProject\\python-test\\venvP3', 'E:\\PythonProject\\python-test\\venvP3\\lib\\site-packages', 'E:\\PythonProject\\python-test\\venvP3\\lib\\site-packages\\setuptools-40.8.0-py3.6.egg', 'E:\\PythonProject\\python-test\\venvP3\\lib\\site-packages\\pip-19.0.3-py3.6.egg', 'D:\\software\\pycharm\\install\\PyCharm 2019.1.1\\helpers\\pycharm_matplotlib_backend']

Process finished with exit code 0

前兩個是當(dāng)前.py程序所在的路徑,python解釋器會按照上面列表中的路徑依次去尋找要導(dǎo)入的.py文件,找到了就立刻導(dǎo)入,不再繼續(xù)往后找。
注意:可能有的人第一個元素為空(""),是代表當(dāng)前目錄,所以自己定義的模塊在當(dāng)前目錄會被優(yōu)先導(dǎo)入。

1.7開源模塊安裝、使用

https://pypi.org/ 是開源模塊庫

模塊、包

安裝方式1:
直接下載.tar.gz,解壓后進(jìn)入目錄,執(zhí)行下面命令完成安裝

編譯源碼:python3 setup.py build
安裝源碼:python3 setup.py install

安裝方式2:

pip3 install paramiko

pip會自動到開源模塊庫中下載安裝包并安裝
軟件一般會自動安裝到python的安裝目錄下的site-packages中
/your_python_install_path/3.6/lib/python3.6/site-packages
pip默認(rèn)會連接國外的Python官網(wǎng)下載,下載速度比較慢,可以使用國內(nèi)的豆瓣元,會同步國外的官網(wǎng),速度快很多

sudo pip install -i http://pypi.douban.com/simple/ alex_sayhi --trusted-host pypi.douban.com   #alex_sayhi是模塊名

1.8模塊的使用

下載后,直接導(dǎo)入使用就可以

#coding:utf-8

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.1.108', 22, 'alex', '123')

stdin, stdout, stderr = ssh.exec_command('df')
print(stdout.read())
ssh.close();

執(zhí)行命令 - 通過用戶名和密碼連接服務(wù)器

2.包

.
└── my_proj
    ├── crm #代碼目錄
    │   ├── admin.py
    │   ├── apps.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── manage.py
    └── my_proj #配置文件目錄
        ├── settings.py
        ├── urls.py
        └── wsgi.py

像上面那樣,一個文件夾管理多個模塊文件,這個文件夾就被稱為包
不同包之間的模塊導(dǎo)入

"crm/views.py內(nèi)容"
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
def sayhi():
    print("hello")

"manage.py中內(nèi)容"
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
from crm import views
views.sayhi()

>python2 E:/PythonProject/python-test/BasicGrammer/mypro/manage.py
Traceback (most recent call last):
  File "E:/PythonProject/python-test/BasicGrammer/mypro/manage.py", line 4, in <module>
    from crm import views
ImportError: No module named crm

"python2中,會報(bào)模塊找不到,為什么?"
包是文件夾,但該文件夾下必須存在__init__.py文件,改文件的內(nèi)容可以為空。__init__.py用于標(biāo)識當(dāng)前文件夾就是一個包。
在crm目錄下創(chuàng)建一個空文件__init__.py,在執(zhí)行一次就可以了
(venvP3) E:\PythonProject\python-test\BasicGrammer\mypro\crm>dir
 E:\PythonProject\python-test\BasicGrammer\mypro\crm 的目錄

2019/05/05 周日  15:37                95 views.py
2019/05/05 周日  15:42               314 views.pyc
2019/05/05 周日  15:42                61 __init__.py

>python2 E:/PythonProject/python-test/BasicGrammer/mypro/manage.py
hello

>python3 E:/PythonProject/python-test/BasicGrammer/mypro/manage.py
hello

(venvP3) E:\PythonProject\python-test\BasicGrammer>
"注意:在Python3中,即使目錄下沒有__Init__.py文件也能創(chuàng)建成功,應(yīng)該是解釋器優(yōu)化所致,但創(chuàng)建包最好還是加上__init__.py文件"
實(shí)際使用中,我們會使用pycharm創(chuàng)建一個package時,會自動創(chuàng)建__init__.py,不需要我們手動創(chuàng)建

3.跨模塊導(dǎo)入

目錄結(jié)構(gòu)如下
.
├── __init__.py
├── crm
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   ├── views.py  
├── manage.py   
└── proj
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

根據(jù)上面的結(jié)構(gòu),如何實(shí)現(xiàn)在crm/views.py里導(dǎo)入proj/settings.py模塊?
直接導(dǎo)入的話,會報(bào)錯,說找到不模塊
因?yàn)楫?dāng)前入口是views.py,那么當(dāng)前sys.path中的當(dāng)前路徑是crm,在crm下沒有proj

$ python3 views.py
Traceback (most recent call last):
  File "views.py", line 2, in <module>
    from proj import settings
ModuleNotFoundError: No module named 'proj'

那要怎么辦呢,可以自己設(shè)置環(huán)境變量,把crm的父級路徑添加到sys.path中,就可以了,這樣導(dǎo)入就相當(dāng)于從父級開始找模塊了。

crm/views.py中添加環(huán)境變量
import sys ,os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #__file__的是打印當(dāng)前被執(zhí)行的模塊.py文件相對路徑,注意是相對路徑
print(BASE_DIR)

sys.path.append(BASE_DIR)  

from proj import settings

def sayhi():
    print('hello world!')

print(settings.DATABASES)

$ python3 views.py
/Users/alex/Documents/work/PyProjects/luffy_課件/21天入門/chapter4-常用模塊/packages/my_proj
---my proj init---  #proj/__init__.py輸出
in proj/settings.py #proj/settings.py輸出
{'host': 'localhost'}

那此時依舊執(zhí)行views.py,在proj/settings.py寫上import urls會有問題么?

DATABASES= {
    'host':'localhost'
}

import urls  #這行剛加的 
print('in proj/settings.py')

結(jié)果報(bào)錯了
ModuleNotFoundError: No module named 'urls'

因?yàn)槌绦蛉肟谑莢iews.py,剛剛加入環(huán)境變量的是crm和proj的父級目錄,當(dāng)前目錄又是crm目錄,所以在這兩個路徑下都沒有urls.py需要改成下面這樣

DATABASES= {
    'host':'localhost'
}

from proj import urls  #proj的父級目錄已經(jīng)添加到sys.path里,可以直接在proj中找到urls.py
print('in proj/settings.py')

4.絕對導(dǎo)入和相對導(dǎo)入

在linux里可以通過cd ..回到上一層目錄 ,cd ../.. 往上回2層,這個..就是指相對路徑,在python里,導(dǎo)入也可以通過..
例如:

.
├── __init__.py
├── crm
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   ├── views.py  #from ..proj import settings 
├── manage.py   
└── proj
    ├── __init__.py
    ├── settings.py #from .import urls  
    ├── urls.py
    └── wsgi.py

views.py中代碼

from ..proj import settings
def sayhi():
    print('hello world!')

print(settings.DATABASES)
執(zhí)行結(jié)果報(bào)錯了
Traceback (most recent call last):
File "my_proj/crm/views.py", line 4, in <module>
 from ..proj import settings
SystemError: Parent module '' not loaded, cannot perform relative import
或有人看到下面的錯誤
ValueError: attempted relative import beyond top-level package
其實(shí)這兩個錯誤的原因歸根結(jié)底是一樣的:
在涉及到相對導(dǎo)入時,package所對應(yīng)的文件夾必須正確的被python解釋器視作package,而不是普通文件夾。否則由于不被視作package,無法利用package之間的嵌套關(guān)系實(shí)現(xiàn)python中包的相對導(dǎo)入。
文件夾被python解釋器視作package需要滿足兩個條件:
1.文件夾中必須有__init__.py文件,該文件可以為空,但必須存在該文件。
2.不能作為頂層模塊來執(zhí)行該文件夾中的py文件(即不能作為主函數(shù)的入口)。
所以這個問題的解決辦法就是,既然你在views.py里執(zhí)行了相對導(dǎo)入,那就不要把views.py當(dāng)作入口程序,可以通過上一級的manage.py調(diào)用views.py
.
├── __init__.py
├── crm
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   ├── views.py  #from ..proj import settings 
├── manage.py  #from crm import views 
└── proj
    ├── __init__.py
    ├── settings.py #from .import urls  
    ├── urls.py
    └── wsgi.py
事實(shí)證明還是報(bào)錯
ValueError: attempted relative import beyond top-level package
但把from ..proj import settings 改成from . import models 后卻執(zhí)行成功了,為什么呢?

from ..proj import settings 會報(bào)錯的原因是,這句代碼會把manage.py所在的這一層視作package,但實(shí)際上它不是,因?yàn)閜ackage不能是頂層入口代碼,若想不出錯,只能把manage.py往上再移一層。

正確的代碼目錄結(jié)構(gòu)如下
    packages/
    ├── __init__.py
    ├── manage.py #from my_proj.crm  import views
    └── my_proj
        ├── crm
        │   ├── admin.py
        │   ├── apps.py
        │   ├── models.py
        │   ├── tests.py
        │   ├── views.py  #from . import models;  from ..proj import settings 
        └── proj
            ├── __init__.py
            ├── settings.py
            ├── urls.py
            └── wsgi.py
再執(zhí)行manage.py就不會報(bào)錯了。
"注:雖然python支持相對導(dǎo)入,但對模塊間的路徑關(guān)系要求比較嚴(yán)格,處理不當(dāng)就容易出錯,所以并不建議在項(xiàng)目里經(jīng)常使用。"

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

文章題目:模塊、包-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://jinyejixie.com/article32/cshdpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、搜索引擎優(yōu)化、品牌網(wǎng)站制作、網(wǎng)站策劃、企業(yè)建站、用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
商城县| 六盘水市| 渝中区| 马尔康县| 永安市| 宁南县| 璧山县| 佛山市| 太康县| 长春市| 库尔勒市| 墨江| 彭山县| 修武县| 桃园县| 安乡县| 酒泉市| 资溪县| 甘肃省| 汤原县| 澄江县| 铁力市| 德保县| 旬阳县| 云林县| 秦皇岛市| 仙桃市| 沅陵县| 屏东县| 嘉定区| 封丘县| 双峰县| 全州县| 老河口市| 新丰县| 寻乌县| 衡水市| 石嘴山市| 两当县| 丹棱县| 长春市|