自己写了个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 * # 此项为必须!必不可少!注意.不可缺少!