自定義 Python 庫
使用虛擬環境
使用虛擬環境可以隔離其他環境, 當然也可以不使用
使用 virtualenvwrapper 建立虛擬環境
$ mkvirtualenv Setup -p /usr/bin/python3.7
(Setup)$ pip3 list
輸出
Package Version
---------- -------
pip 20.1
setuptools 46.1.3
wheel 0.34.2
其中 setuptools 是用於自定義 Python 第三方庫的工具
入門示例
新建文件 setup.py, 內容如下
from setuptools import setup
setup(
name="demo",
version="0.1",
scripts=[]
)
過程很簡單, 僅僅調用了 setup 函數
編譯安裝該庫
(Setup)$ python3 setup.py install
查看當前庫
(Setup)$ pip3 list
Package Version
---------- -------
demo 0.1
pip 20.1
setuptools 46.1.3
wheel 0.34.2
已經多出了一個庫 demo, 當然該庫僅僅是個擺設, 使用 import demo 會報錯
使用命名 setup.py 是一個慣例, 可以使用其他名稱
(Setup)$ mv setup.py test.py
(Setup)$ python3 test.py install
使用模塊
在同一目錄創建兩個文件 setup.py 和 demo.py
demo.py 的內容如下, 在 Demo 類中使用了 property 裝飾器來封裝 name 屬性
__version__ = "0.2"
def add(x, y):
return x + y
class Demo:
def __init__(self):
self.__name = "jianghuixin"
@property
def name(self):
return self.__name
@name.setter
def name(self, value):
self.__name = value
改寫 setup.py
from setuptools import setup
setup(
name="demo",
version="0.2",
scripts=["demo.py"]
)
在當前目錄編譯安裝
(Setup)$ python3 setup.py install
成功安裝 0.2 版的 demo 庫, 該庫可以被導入使用
(Setup)$ python3
Python 3.7.5 (default, Nov 7 2019, 10:50:52)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import demo
>>> demo.__version__
'0.2'
>>> demo.add(1, 2)
3
>>> d=demo.Demo()
>>> d.name
'jianghuixin'
>>> d.name="Hoss"
>>> d.name
'Hoss'
使用包
在一個目錄下建立一個包和 setup.py
.
.
├── demo
│ ├── demo.py
│ └── __init__.py
└── setup.py
demo.py 的內容
__version__ = "0.3"
def multiply(x, y):
return x * y
class Zeros:
def __init__(self, length):
self.length = length
def __len__(self):
return int(self.length)
def __getitem__(self, item):
if item < self.length:
return 0
else:
raise IndexError
setup.py 的內容:
from setuptools import setup
setup(
name="demo",
version="0.3",
description="demo",
author="jianghuixin",
packages=["demo"]
)
在當前目錄編譯安裝
(Setup)$ python3 setup.py install
(Setup)$ python3
Python 3.7.5 (default, Nov 7 2019, 10:50:52)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from demo import demo
>>> demo.__version__
'0.3'
>>> demo.multiply(1, 2)
2
>>> z=demo.Zeros(3.6)
>>> len(z)
3
>>> list(z)
[0, 0, 0, 0]
查看庫信息
(Setup)$ pip3 show demo
Name: demo
Version: 0.3
Summary: demo
Home-page: UNKNOWN
Author: jianghuixin
Author-email: UNKNOWN
License: UNKNOWN
Location: /home/jianghuixin/.virtualenvs/Setup/lib/python3.7/site-packages/demo-0.3-py3.7.egg
Requires:
Required-by: