如何使用子包正确打包 Python3 应用程序



我有一个包,s3_backend,它包含一个模块api.py,和一个子包util,它本身包含5个模块。我想打包它并将其上传到 PyPI,以便人们可以在顶级包中pip install package和使用脚本 api、api.py。两个软件包(s3_backend和's3_backend.util')都包含_init__.py文件。

整个项目保存在具有以下结构的目录名称project

project
|- s3_backend (package)
|- __init__.py
|- util (package)
|- __init__.py
|- module1.py
|...
|- module5.py
|- api.py
|- setup.py

api.py本身进口modules1-4.

在本地,从project内部,我可以做 导入接口 api.func1()... 没有错误。当我将软件包上传到 TestPyPI 并将软件包安装在新目录中的 virtualenv 中时,我遇到了问题,这些问题可以追溯到从子包s3_backend.util导入modules1-4api.py导入语句。

此行 从实用程序导入模块 1、模块 2、模块 3、模块 4 引发此错误 没有模块名称"util" 当我运行此命令时 从s3_backend导入实用程序

我可以成功

import s3_backend

help(s3_backend)

显示

api.py
util (package)

我的 setup.py 内容如下所示。处理 setup.py 中的子包的正确方法是什么,我是否写错了导入语句?

对于修复,我尝试更换

from util import ...

from .util import ... 

from s3_backend.util import ... 

但这些在当地造成了问题。

setup.py 的源代码:

# project/setup.py
from distutils.core import setup
setup(
name='s3_backend',
version='0.1.7',
license='MIT',
description='scripting api for file upload to s3',
author='SkippyElvis',
author_email='Skippy@Elvis.com',
url='https://github.com/jackhwolf/s3_backend',
keywords=['aws', 's3', 'file upload'],
packages=['s3_backend', 's3_backend.util'],
classifiers=[
'Programming Language :: Python :: 3',
],
)

api.py 中的导入语句:

from util import module1, module2, module3, module4

如果您还需要帮助我,请告诉我。谢谢!

斯基皮猫王

你能尝试使用设置工具吗?只要您要包含的每个文件夹中都有一个init.py 文件,find_packages 函数就可以很好地工作。

以下是您需要在 setup.py 中使用的内容

# project/setup.py
from setuptools import setup, find_packages
setup(
name='s3_backend',
version='0.1.7',
license='MIT',
description='scripting api for file upload to s3',
author='SkippyElvis',
author_email='Skippy@Elvis.com',
url='https://github.com/jackhwolf/s3_backend',
keywords=['aws', 's3', 'file upload'],
packages=find_packages(),
classifiers=[
'Programming Language :: Python :: 3',
],
)

否则,你可以用一个函数来模仿find_packages。我不建议这样做。

至于您的导入,我提倡使用绝对的根级导入。这强制执行了两件事:它确保您在内部以用户使用库的方式使用库。此外,它还确保您不会尝试从某个文件夹中测试代码,而是通过测试来调用它。它"强制执行"的方式是,您的绝对导入无法从某个文件夹内工作。相反,它需要通过外部文件/函数调用来调用。

相关内容

  • 没有找到相关文章

最新更新