• Python怎么打包和安装自定义的模块?


    自己写了个py文件,之前一直是把这文件复制到当前的目录下,用 import 来导入使用。
    但是后来觉得这样太麻烦了,而且修改的时候容易造成混乱和出错。
    于是突发奇想,能不能把它做成pandas那样的包来安装,那就方便很多了。
    于是找了许多资料,发现果然有这样的方法。
    折腾了一天,其中各种出错,但终于弄好了。

    1.严格的目录结构

    目录结构必须符合:

    MyPackages/
    ├── README.txt # txt或md格式;txt必须为ANSI编码,否则打包时会出错
    ├── setup.py # 此文件必不可少
    └── MyKlines/ # 文件夹,名称为模块的名称
    	├── __init__.py # 必须,里面可以没有代码
    	└── MyKlines.py  # 这是需要打包的py文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.建立__init__.py文件

    在MyKlines文件夹下创建__init__.py文件,__init__.py文件的内容如下:

    # 导入当前目录的.MyKlines
    from .MyKlines import *  # 此项为必须!必不可少!
    __version__ = '1.0'  # 设置版本信息
    
    • 1
    • 2
    • 3

    3.放置MyKlines.py文件

    把需要打包的MyKlines.py复制到MyKlines文件夹下面,和__init__.py同一层级。

    4.setup.py文件

    在需要打包的模块,同一目录,即MyPackages文件夹下创建setup.py文件。

    from setuptools import setup
    # from setuptools import find_packages
    setup(
        name="MyKlines",
        version="2022.12.2",
        author="梦悠",
        author_email="1756186835@qq.com",  # 作者邮箱
        url='',  # github或者自己的网站地址
        description="绘制K线、反转图、砖型图等;获取股票和期货数据",
        long_description=open('README.txt').read(),  #读取文件中介绍包的详细内容
        long_description_content_type="text/markdown",  # 指定详细描述的文本格式
        python_requires=">=3.6.0",  # python依赖版本
        license="MIT Licence",  # 指定许可证
        install_requires=[""],  # 需要安装的依赖,如["matplotlib", "talib", "pylab", "numpy", "pandas", "baostock"]
        packages=[
            "MyKlines",
        ],  # 打包目录下的指定模块
        # packages=find_packages(),  # 打包目录下的全部模块
        # packages=find_packages(exclude=["test", "test.*"])			# 打包除了指定模块的全部模块
        # include_package_data = True,									# 打包路径下的其他文件
        platforms="any",  # 程序适用的软件平台列表
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    5.CMD进入setup.py所在目录

    CMD命令行,进入到setup.py文件所在目录。
    注意:需要输入两次命令。

    # 第一次输入 cd E:\Python\MyPackage
    C:\Users\caogu>cd E:\Python\MyPackage
    # 第二次输入 E:
    C:\Users\caogu>E:
    
    • 1
    • 2
    • 3
    • 4

    或者,在setup.py文件所在目录的地址栏输入cmd并回车打开命令行。

    6.运行打包命令

    python setup.py bdist_wheel
    
    • 1

    运行结果:

    running bdist_wheel
    running build
    installing to build\bdist.win-amd64\wheel
    running install
    running install_egg_info
    running egg_info
    creating MyKlines.egg-info
    writing MyKlines.egg-info\PKG-INFO
    writing dependency_links to MyKlines.egg-info\dependency_links.txt
    writing top-level names to MyKlines.egg-info\top_level.txt
    writing manifest file 'MyKlines.egg-info\SOURCES.txt'
    reading manifest file 'MyKlines.egg-info\SOURCES.txt'
    writing manifest file 'MyKlines.egg-info\SOURCES.txt'
    Copying MyKlines.egg-info to build\bdist.win-amd64\wheel\.\MyKlines-2022.12.2-py3.8.egg-info
    running install_scripts
    creating build\bdist.win-amd64\wheel\MyKlines-2022.12.2.dist-info\WHEEL
    creating 'dist\MyKlines-2022.12.2-py3-none-any.whl' and adding 'build\bdist.win-amd64\wheel' to it
    adding 'MyKlines-2022.12.2.dist-info/METADATA'
    adding 'MyKlines-2022.12.2.dist-info/WHEEL'
    adding 'MyKlines-2022.12.2.dist-info/top_level.txt'
    adding 'MyKlines-2022.12.2.dist-info/RECORD'
    removing build\bdist.win-amd64\wheel
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    打包完成后生成了3个文件夹:

    MyKlines.egg-info
    dist
    build
    
    • 1
    • 2
    • 3

    可安装的wheel文件就在dist文件夹里面

    MyKlines-2022.12.2-py3-none-any.whl
    
    • 1

    7.打开dist文件夹,在cmd安装whl文件

    pip install MyKlines-2022.12.2-py3-none-any.whl
    
    • 1

    安装成功:

    Processing e:\python\mypackage\dist\myklines-2022.12.2-py3-none-any.whl
    Installing collected packages: MyKlines
    Successfully installed MyKlines-2022.12.2
    
    • 1
    • 2
    • 3

    测试一下:

    from MyKlines import *
    
    data = get_data_juejin(symbol="bu2301", start="2022-12-2", end="2022-12-2 23:00:00", frequency="15m", adjust=0)
    print(data)
    
    • 1
    • 2
    • 3
    • 4

    完美运行:

                      date  symbol frequency    open   close    high     low  volume       money  position
    0  2022-12-02 09:15:00  bu2301       15m  3462.0  3475.0  3484.0  3460.0   15299  5.3121e+08    124838
    1  2022-12-02 09:30:00  bu2301       15m  3475.0  3478.0  3481.0  3473.0    4380  1.5230e+08    124355
    2  2022-12-02 09:45:00  bu2301       15m  3478.0  3493.0  3495.0  3478.0    6288  2.1931e+08    124486
    3  2022-12-02 10:00:00  bu2301       15m  3493.0  3523.0  3523.0  3488.0   13946  4.8931e+08    124601
    4  2022-12-02 10:15:00  bu2301       15m  3523.0  3516.0  3524.0  3515.0    8586  3.0217e+08    125492
    5  2022-12-02 10:45:00  bu2301       15m  3516.0  3524.0  3525.0  3510.0    6973  2.4534e+08    125447
    6  2022-12-02 11:00:00  bu2301       15m  3524.0  3534.0  3535.0  3517.0    7355  2.5921e+08    125067
    7  2022-12-02 11:15:00  bu2301       15m  3534.0  3542.0  3544.0  3530.0   12721  4.5010e+08    125301
    8  2022-12-02 11:30:00  bu2301       15m  3541.0  3544.0  3548.0  3536.0    7481  2.6508e+08    124536
    9  2022-12-02 13:45:00  bu2301       15m  3541.0  3538.0  3543.0  3527.0    9235  3.2655e+08    125234
    10 2022-12-02 14:00:00  bu2301       15m  3538.0  3544.0  3545.0  3535.0    5780  2.0462e+08    125464
    11 2022-12-02 14:15:00  bu2301       15m  3543.0  3556.0  3558.0  3542.0    7657  2.7184e+08    125087
    12 2022-12-02 14:30:00  bu2301       15m  3557.0  3542.0  3562.0  3539.0    7927  2.8152e+08    124268
    13 2022-12-02 14:45:00  bu2301       15m  3543.0  3540.0  3553.0  3535.0    5598  1.9834e+08    123743
    14 2022-12-02 15:00:00  bu2301       15m  3540.0  3537.0  3547.0  3532.0   22021  7.7935e+08    121299
    15 2022-12-02 21:15:00  bu2301       15m  3536.0  3552.0  3556.0  3513.0   27498  9.7131e+08    118748
    16 2022-12-02 21:30:00  bu2301       15m  3553.0  3542.0  3556.0  3538.0    8426  2.9888e+08    118993
    17 2022-12-02 21:45:00  bu2301       15m  3543.0  3534.0  3544.0  3530.0   11737  4.1514e+08    118833
    18 2022-12-02 22:00:00  bu2301       15m  3533.0  3515.0  3535.0  3514.0    9716  3.4224e+08    117886
    19 2022-12-02 22:15:00  bu2301       15m  3515.0  3502.0  3517.0  3488.0   16185  5.6649e+08    115532
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    附录:打包过程遇到的错误!

    1.ModuleNotFoundError

    当我们导入自定义的模块import MyKlines时,提示出错:

    ModuleNotFoundError: No module named 'MyKlines'
    
    • 1

    这是 由于setup.py文件中,setup()函数没有这条代码造成的:

    packages=[ "MyKlines",]  # 打包目录下的指定模块
    
    • 1

    简单地说,就是没有正确地打包,在wheel文件中没有打包到需要的模块。

    2.AttributeError

    模块已经安装,pip list也已经看到了模块,并且能导入到py文件里,但是无法使用模块中的函数。

    AttributeError: module 'MyKlines' has no attribute 'get_data_juejin'
    
    • 1

    这是因为__init__.py文件出错。
    __init__.py的代码中,缺少了导入模块的命令。
    加入以下命令即可。注意.不可缺少。

    from .MyKlines import *  # 此项为必须!必不可少!注意.不可缺少!
    
    • 1
  • 相关阅读:
    阿里云国际版CDN的优势
    JVM【类加载与GC垃圾回收机制】
    【C++】初识类和对象
    docker-compose安装yapi接口文档工具——筑梦之路
    Firewalld防火墙
    博世「求援」,毫米波雷达重构
    TRUNK通信过程
    亿流量大考(2):开发一套高容错分布式系统
    Blazor项目在VisualStudio调试时配置运行基础目录
    LeetCode 1624. 两个相同字符之间的最长子字符串
  • 原文地址:https://blog.csdn.net/qq_37944726/article/details/128155597