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