【发布时间】:2017-12-12 17:36:22
【问题描述】:
如果我像这样制作一个非常简单的包(带有空的__init__.py 文件):
package_name/
package_name/
sub_module/
__init__.py
file.py
__init__.py
setup.py
当我在这个项目的根目录下启动一个 Python shell 时:
import package_name.sub_module.file
一切顺利,我可以使用file.py 中的功能。但是如果我在 GitLab 上发送这个项目,然后将它 pip 安装在另一个本地项目中并以相同的方式导入,我会收到以下错误:
ModuleNotFoundError: No module named 'package_name.sub_module'
我尝试以多种方式修改__init__.py 文件,但找不到有效的方法。我不明白为什么会这样。
编辑:这是setup.py文件的内容:
from setuptools import setup
setup(name='package_name',
version='0.1',
description='My package',
url='https://gitlab.myserver.com/package_name',
author='Me',
author_email='me@myserver.com',
license='MIT',
packages=['package_name'],
install_requires=[
'another_package_1',
'another_package_2'
],
zip_safe=False)
要使用 pip 安装包,我使用命令:
pip install git+https://gitlab.myserver.com/package_name.git
【问题讨论】:
-
问题的根源可能在
setup.py内部或在您的安装步骤中。你向setup()传递了什么论据?您输入了哪些命令来安装软件包?没有它,就不可能知道出了什么问题。 -
我敢打赌这是
packageskwarg。你用packages=['package_name']调用你的setup函数吗? -
我按照 pip 打包教程中的说明进行操作。明天我会用它的内容编辑这个问题。是的,我使用 package=['package_name'] 命令。
-
我刚刚发现了 'packages=find_packages(exclude=['contrib', 'docs', 'tests*'])' 选项。我想我误解了包裹的声明方式。如果我必须手动执行,是否意味着我必须编写 packages=['package_name', 'package_name.sub_module' ?
-
@debzsud 确切地说,您必须按其全名明确列出 all 包。包括
foo并不意味着包括foo.bar。建议使用setuptools中的find_packages函数,这样您就不必每次创建新包时都更新包列表。
标签: python pip package python-import