【问题标题】:Setuptools python - import problem inside projectSetuptools python - 项目内的导入问题
【发布时间】:2019-01-01 23:56:36
【问题描述】:

我正在尝试构建简单的项目,然后准备创建 whl 文件。但是在pip install <name>.whl 之后我遇到了奇怪的导入问题。 项目结构:

foo/
    /foo
        __init__.py
        main.py
        bar.py
    setup.py

setup.py 文件:

from setuptools import setup, find_packages

setup(
    name='foo',
    version='0.0.1',
    packages=find_packages(),
    include_package_data=True,
    entry_points={'console_scripts': ['foo=foo.main:func1']}
)

main.py

from bar import func2

def func1():
    print('func1')
    func2()

bar.py

def func2():
    print('func2')

我有一个空的初始化文件。

我通过命令创建 whl 文件:python3 setup.py bdist_wheel 然后cd dist/ && pip install ...

但是当我通过foo 运行脚本时出现错误:

ModuleNotFoundError: 没有名为“bar”的模块

仅当我将项目拆分为几个文件时才存在此问题,当我尝试将所有内容保留在 main.py(已删除 bar.py)中而不导入时,它才起作用。

知道我应该如何修改 setup.py 吗?

【问题讨论】:

  • 我认为问题在于您的 imports,而不是您的 setup.py。我认为应该是from foo.bar import func2? (或者如果你想使用包间导入,from .bar import func2
  • 呵呵,谢谢,没想到:)
  • 没问题。我现在有几分钟的时间 - 我将对此进行一些扩展并将其写下来作为答案,希望有一天它会对其他人有所帮助......

标签: python import python-import setuptools setup.py


【解决方案1】:

问题在于您的 imports——而不是您的 setup.py。发生的事情是您的setup.py 正在安装包foo,它具有子模块mainbar

要从子模块导入函数,您可以执行以下操作:

from foo.bar import func2

或者,如果您正在执行包相对导入(例如,从 main 导入 bar):

from .bar import func2

如果正在执行导入的模块不是 foo 包的一部分,则第二个版本将不起作用。

【讨论】:

    猜你喜欢
    • 2021-07-13
    • 2012-04-08
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    相关资源
    最近更新 更多