【问题标题】:Python - import module which imports modulePython - 导入模块的导入模块
【发布时间】:2023-12-07 09:36:01
【问题描述】:

我在同一个位置有三个脚本:

   /__init__.py
    interface.py
    radio.py
    playlist.py

playlist.py 存储了子类,例如:

class playlist1(radio):
    '''child class'''

radio.py 有父类:

class radio(object):
    '''parent class'''

我正在尝试运行interface.py,它有:

if __name__ == "__main__":
    from playlist import *

playlist.py 我有这个导入,轮到它了:

from radio import radio

但是当我运行interface.py 时,出现以下错误:

ImportError: cannot import name radio

我使用python 2.x。怎么了?

【问题讨论】:

  • 我无法仅使用您在此处显示的设置重现该问题。如果我创建您显示的三个文件,以及您显示的内容(加上空的__init__.py),我可以运行interface.py 而不会出错。我怀疑其中一个文件中还有其他内容,或者您​​在其他地方有另一个名为 radio.py 的文件正在导入。

标签: python class module


【解决方案1】:

您对情况的描述省略了一个关键部分:这些模块所在的包。例如,如果他们住在foo 包中,情况将如下所示:

foo/
    __init__.py
    interface.py
    radio.py
    playlist.py

在这种情况下,playlist 模块从radio 模块导入名称有两种常用方法:

# 1. Fully qualified.
from foo.radio import radio

# 2. Relative import.
from .radio import radio

强烈推荐第二种方法,因为它没有歧义的余地。

你也没有告诉我们你是如何运行interface.py的。这些细节也会影响导入情况。

如果您在包中组织代码,则需要遵循常规 项目结构。在这种布局中,您倾向于在项目中工作 根。您还需要一个合适的setup.py 文件。下面是它的样子:

# ----
# Directory layout.
some_project/
    foo/
        __init__.py
        interface.py
        playlist.py
        radio.py
    setup.py

    # You work at this level.

# ----
# interface.py 

from playlist import radio

def main():
    print radio

# ----
# playlist.py

from .radio import radio

# ----
# radio.py

radio = 123

# ----
# setup.py

from setuptools import setup

setup(
    name     = 'foo',
    version  = '1.0',
    zip_safe = False,
    packages = ['foo'],
    entry_points = {
        'console_scripts': [
            'foobar = foo.interface:main',
        ],
    },
)

# ----
# Install stuff for dev work (ie in "editable" mode).
pip install -e .

# ----
# Run the command line entry point.
foobar

【讨论】:

  • dotnotation 不是 python 3.x?我的是2.x。如果我按你说的做,我会得到ValueError: Attempted relative import in non-package。所有文件都在根目录下。
  • 如果你在包中组织代码,你需要遵循标准的项目结构。由于各种原因,将所有内容放在根目录中并从根目录运行代码将无法正常工作——首先是 Python 不会将根目录解释为包。关于这个主题有各种资源,但这里有一个:jeffknupp.com/blog/2013/08/16/…
  • @data_garden 我添加了一些关于项目结构的更多细节
【解决方案2】:

我认为你只需要创建一个名为

的空文件
__init__.py 

在与文件相同的目录中。这会让 Python2 知道可以从这个目录导入。 然后使用您的代码。

【讨论】:

  • 它已经在那里了,我忘了提,现在在我的编辑中已经完成了。对不起。
  • 你有没有循环进口?