一、背景
我们平时使用pip install xxx
安装包,使用包,但是如果:我们拉取pypi社区的某GitHub项目源码后,发现其源码某文件
中会出现:
py
import xxx.module_A
from xxx import module_A
import xxx.module_A as A
from xxx import module_A as A
这种字样
注意 :这里的xxx是某文件
所在目录的包名,也就是其所属包的名字
注意:不可以直接导入包,python是一定要落脚于模块的
那么直接运行源码,会出现依赖的问题;如何解决这个问题,是本博客解决的事情
类似于下图的依赖过程:
tool.py依赖my_module.py时,平时都是直接引入模块名,但是在发布后的包中,会出现import my_package.my_module as my_module
:
和我们认知中不一样,并且直接运行这个脚本会出错:
所以我们需要搞清楚这个包为什么这样引入
二、实验过程
包的文件结构:
注意 :实际的包是my_package,而不是这个项目
与第一部分一样,tool依赖了my_module
使用时的测试代码:
py
import my_package.tool as tool
if __name__ == "__main__":
print("hello world")
tool.my_tool()
构建包
在项目目录下(而不是实际的包目录下),新建setup.py
文件:
py
from setuptools import setup, find_packages
VERSION = '0.0.1'
DESCRIPTION = 'My first Python package'
LONG_DESCRIPTION = 'My first Python package with a slightly longer description'
# 配置
setup(
# 名称必须匹配文件名 'verysimplemodule'
name="my_package",
version=VERSION,
author="masteryi",
author_email="<youremail@email.com>",
description=DESCRIPTION,
long_description=LONG_DESCRIPTION,
packages=find_packages(),
install_requires=[], # add any additional packages that
# 需要和你的包一起安装,例如:'caer'
keywords=['python', 'first package'],
classifiers= [
"Development Status :: 3 - Alpha",
"Intended Audience :: Education",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
"Operating System :: MacOS :: MacOS X",
"Operating System :: Microsoft :: Windows",
]
)
测试包
执行python setup.py install
本地安装自己写的包:
成功安装:
在测试文件测试,成功输出:
shell
PS D:\project\test_my_pkg> python .\test.py
hello world
this is my_module
this is sub_pkg's m_1
this is sub_pkg's m_2
三、心得
构建包的话,各个模块需要统一引入包名作为所构建包的名称
,子包也是一样的处理,否则会出现找不到包的问题
如果按照自己的构建项目的方式构建包,就会出现包的路径有问题的情况