跳转至

Pip Package

导言

之前其实开发了自己的包,想写点轮子。但是那个时候并没有。按照对象编程的思想,打算重构并拓展常用内容 from PIA(uniPIM) Project。

__init__.py里的__all__变量

在 Python 中,__all__ 是一个特殊变量,用于定义模块在 import * 语句下导出的公共接口。它通常出现在包的 __init__.py 文件或模块文件中,指定该模块或包的哪些内容可以被外部模块访问。

用法

当在 __init__.py 文件中定义 __all__ 时,例如:

__all__ = ["module_a", "module_b", "some_function"]

它的作用是,当用户执行 from package_name import * 时,只有 __all__ 列表中的项会被导入到当前命名空间。

示例

假设有一个包 mypackage,目录结构如下:

mypackage/
├── __init__.py
├── module_a.py
└── module_b.py

__init__.py 中设置 __all__

# __init__.py
__all__ = ["module_a", "module_b"]

import mypackage.module_a
import mypackage.module_b

然后在使用时:

from mypackage import *

module_amodule_b 会被导入。

发布自己的pip包

注册自己的 PyPi 帐号

也可以是自己搭的 PyPi私服仓库的账号1

依据自己的项目目录,创建setup.py

如下图所示,agent_cli是我整体的项目,我想要将pip-test目录下的代码打包上传到Pypi仓库中;

在pip-test的同级目录,创建setup.py文件

编写自己的setup.py文件

from setuptools import setup, find_packages

setup(
    name='tsjPython',  # 打包后的包文件名
    version='0.1',  # 版本号
    keywords=("tsj"),    # 关键字
    description='personal code for tsj',  # 说明
    long_description="none",  # 详细说明
    license="MIT Licence",  # 许可
    url='http://home.ustc.edu.cn/~shaojiemike',
    author='Shaojie Tan',
    author_email='[email protected]',
    # packages=find_packages(),     #这个参数是导入目录下的所有__init__.py包
    include_package_data=True,
    platforms="any",
    install_requires=['termcolor',
                      'plotille'],    # 引用到的第三方库
    # py_modules=['pip-test.DoRequest', 'pip-test.GetParams', 'pip-test.ServiceRequest',
    #             'pip-test.ts.constants', 'pip-test.ac.Agent2C',
    #             'pip-test.ts.ttypes', 'pip-test.ac.constants',
    #             'pip-test.__init__'],  # 你要打包的文件,这里用下面这个参数代替
    packages=['tsjPython']  # 这个参数是导入目录下的所有__init__.py包
)

打包自己的项目

执行下述两条命令

python setup.py build    #执行此命令后,会生成上面图片中build的目录,目录层级是  build/lib/pip-test,  pip-test目录下就是你打包文件解压后的结果,可以在此查看打包的代码是否完整

python setup.py sdist    # 执行此命令后,就会在dist目录下生成压缩包文件 .tar.gz

上传到PyPi服务器

在上传前,要建一个文件,$HOME/.pypirc$HOME目录在linux或者mac系统下就是~/目录。在这里建一个 .pypirc文件。里边的内容如下:

[distutils]
index-servers = pypi

[pypi]
username:你的PyPi用户名
password:你的PyPi密码

或者使用token.

注册好之后,生成一个 token:https://pypi.org/manage/account/#api-tokens。由于我们是要上传新项目,所以不要限制 scope 到特定的项目。

[pypi]
username = __token__
password = <换成你刚刚复制下来的 token, 包括 `pypi-` 前缀>

提前安装 py -m pip install --upgrade twine

执行此命令: twine upload dist/XXXXX-0.1.0.tar.gz 上传你刚刚打包好的压缩包

安装使用

使用 pip install XXX 就可以轻松使用

开发测试包

如果为了测试而上传代码,会占用版号。

可以通过先安装在本地来实现

pip install packageName
pip uninstall packageName

开发时避免经常重复安装

使用 setup.py 安装的包会被复制到当前环境的 site-packages 目录下,这意味着,一旦我们修改了包的源代码,就需要重新安装它。

setuptools 提供了一个额外的 develop 命令,其完整格式为Python setup.py develop,该命令允许我们在开发模式下安装包,它会在部署目录(site-packages)时创建一个指向项目源代码的特殊链接,而不是将整个包复制过去,从而实现在编辑包的源代码之后无需再重新安装,并且它在 sys.path 中可用,就像正常安装一样。

pip 也支持用这种模式来安装包,这个安装选项叫作可编辑模式,可以使用 install 命令的 -e 参数来启用,代码格式如下:pip install -e 包路径

参考文献

评论