python依賴操作記錄

python安裝依賴需要使用位於python安裝目錄下的script目錄下的pip

pip和pip3區別 只爲區別python2和python3之間的調用 避免衝突

  • 當前系統只安裝了python3 使用pip和pip3無任何區別
  • 當前系統只安裝python2則無法使用pip3
  • 當前系統兩者都安裝使用pip命令 新安裝的庫會在python2.x/site-packages目錄下 使用pip3命令 新安裝的庫會在python3.x/site-packages的目錄下

安裝單個依賴

pip install 依賴名 # 如 pip install requests

安裝多個依賴

setup.py

有的項目包含構建腳本setup.py

setup.py作用 創建方式參考此處

  • 記錄項目模塊並添加到pythonpath 多個模塊可以互相引用
  • 定義需要的第三方依賴 可同時安裝這些依賴 避免pip單個安裝
  • 不同項目引入第三方模塊版本不同 可通過虛擬環境virtualenv 爲不同項目引入不同的pythonpath
# 編譯module 會生成build文件夾 可省略不寫 默認install前自動執行build
python setup.py build
# install複製build/lib文件到用戶指定的lib庫
python setup.py install

requirements.txt

# 獲取當前環境下所有第三方包信息 不能指定項目
pip freeze > requirments.txt

# 使用pipreqs獲取當前項目第三方包信息
pip install pipreqs
# 在制定的項目中執行如下
pipreqs ./ # 執行完後會生成requirements.txt
# 如執行錯誤可指定編碼
pipreqs ./ --encoding=utf-8

# 安裝時無需pip單個依賴 執行如下命令安裝所有依賴
pip install -r requirements.txt

刪除依賴

pip uninstall -y 模塊名 # 如 pip uninstall -y requests

# 刪除依賴同時刪除此依賴所依賴的模塊
import os

def check_dependents(module_name):
    """
    查看一個模塊的依賴
    :param module_name: 模塊名
    :return: module_name 所依賴的模塊的列表
    """
    with os.popen('pip show %s' % module_name) as p:
        dependents = p.readlines()
        if not len(dependents):
            return None
        dependents = dependents[-1]
        dependents = dependents.split(':')[-1].replace(' ', '').strip()
        if dependents:
            dependents = dependents.split(',')
        else:
            dependents = None
        return dependents


def remove(module_name):
    """
    遞歸地卸載一個模塊
    :param module_name: 模塊名稱
    :return: None
    """
    dependents = check_dependents(module_name)
    if dependents:
        for package in dependents:
            remove(package)
    os.system('pip uninstall -y %s' % module_name)


if __name__ == '__main__':
    pkg_name = input('請輸入要卸載的第三方模塊包: ')
    remove(pkg_name)
__init__.py 作用 將文件夾變爲一個python模塊 python中每個模塊的包中都有__init__.py 文件

通常__init__.py 文件爲空 但也可爲它增加其他功能 導入一個包時 實際上是導入了它的__init__.py文件 可在__init__.py文件中批量導入所需模塊 而無需一個一個導入

# package
# __init__.py
import re
import urllib
import sys
import os

# test.py
import package
print(package.re, package.urllib, package.sys, package.os)

注意這裏訪問__init__.py文件中的引用文件 需要加上包名

init.py中還有一個重要的變量 all 用來將模塊全部導入

# __init__.py
__all__ = ['os', 'sys', 're', 'urllib']

# test.py
from package import *

這時就會把註冊在__init__.py文件中__all__列表中的模塊和包導入到當前文件中來

可以瞭解到 init.py主要控制包的導入行爲 要想清楚理解__init__.py文件的作用 還需要詳細瞭解一下import語句引用機制

可以被import語句導入的對象是以下類型

模塊文件 .py文件
C或C++擴展 已編譯爲共享庫或DLL文件
包 包含多個模塊
內建模塊 使用C編寫並已鏈接到Python解釋器中
當導入模塊時 解釋器按照sys.path列表中的目錄順序來查找導入文件

import sys
>>> print(sys.path)

# Linux:
['', '/usr/local/lib/python3.4',
 '/usr/local/lib/python3.4/plat-sunos5',
 '/usr/local/lib/python3.4/lib-tk',
 '/usr/local/lib/python3.4/lib-dynload',
 '/usr/local/lib/python3.4/site-packages']

# Windows:
['', 'C:\\WINDOWS\\system32\\python34.zip', 'C:\\Documents and Settings\\weizhong', 'C:\\Python34\\DLLs', 'C:\\Python34\\lib', 'C:\\Python34\\lib\\plat-win', 'C:\\Python34\\lib\\lib-tk', 'C:\\Python34\\Lib\\site-packages\\pythonwin', 'C:\\Python34', 'C:\\Python34\\lib\\site-packages', 'C:\\Python34\\lib\\site-packages\\win32', 'C:\\Python34\\lib\\site-packages\\win32\\lib', 'C:\\Python34\\lib\\site-packages\\wx-2.6-msw-unicode']

其中list第一個元素空字符串代表當前目錄

關於.pyc 文件 與 .pyo 文件

.py文件的彙編 只有在import語句執行時進行 當.py文件第一次被導入時 它會被彙編爲字節代碼 並將字節碼寫入同名的.pyc文件中 後來每次導入操作都會直接執行.pyc 文件 當.py文件的修改時間發生改變 這樣會生成新的.pyc文件 在解釋器使用-O選項時 將使用同名的.pyo文件 這個文件去掉了斷言 assert 斷行號以及其他調試信息 體積更小 運行更快 使用-OO選項 生成的.pyo文件會忽略文檔信息

導入模塊

模塊通常爲單獨的.py文件 可以用import直接引用 可以作爲模塊的文件類型有.py .pyo .pyc .pyd .so .dll

在導入模塊時 解釋器做以下工作

  • 已導入模塊的名稱創建新的命名空間 通過該命名空間就可以訪問導入模塊的屬性和方法

  • 在新創建的命名空間中執行源代碼文件

  • 創建一個名爲源代碼文件的對象 該對象引用模塊的名字空間 這樣就可以通過這個對象訪問模塊中的函數及變量

import 語句可以在程序的任何位置使用 你可以在程序中多次導入同一個模塊 但模塊中的代碼僅僅在該模塊被首次導入時執行 後面的import語句只是簡單的創建一個到模塊名字空間的引用

sys.modules字典中保存着所有被導入模塊的模塊名到模塊對象的映射

導入包

多個相關聯的模塊組成一個包 以便於維護和使用 同時能有限的避免命名空間的衝突 一般來說 包的結構可以是這樣的

package
  |- subpackage1
      |- __init__.py
      |- a.py
  |- subpackage2
      |- __init__.py
      |- b.py

有以下幾種導入方式

import subpackage1.a # 將模塊subpackage.a導入全局命名空間 例如訪問a中屬性時用subpackage1.a.attr
from subpackage1 import a # 將模塊a導入全局命名空間 例如訪問a中屬性時用a.attr_a
from subpackage.a import attr_a # 將模塊a的屬性直接導入到命名空間中 例如訪問a中屬性時直接用attr_a
使用from語句可以把模塊直接導入當前命名空間 from語句並不引用導入對象的命名空間 而是將被導入對象直接引入當前命名空間


刪除多個依賴原文 https://www.jianshu.com/p/81bffb457ac4
init.py 作用原文 https://www.cnblogs.com/Lands-ljk/p/5880483.html

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