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

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

1.严格的目录结构

目录结构必须符合:

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

2.建立__init__.py文件

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

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

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",  # 程序适用的软件平台列表
)

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

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

# 第一次输入 cd E:\Python\MyPackage
C:\Users\caogu>cd E:\Python\MyPackage
# 第二次输入 E:
C:\Users\caogu>E:

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

6.运行打包命令

python setup.py bdist_wheel

运行结果:

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

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

MyKlines.egg-info
dist
build

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

MyKlines-2022.12.2-py3-none-any.whl

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

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

安装成功:

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

测试一下:

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)

完美运行:

                  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.ModuleNotFoundError

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

ModuleNotFoundError: No module named 'MyKlines'

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

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

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

2.AttributeError

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

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

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

from .MyKlines import *  # 此项为必须!必不可少!注意.不可缺少!
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏悠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值