Python - 导入模块,该模块进一步引入模块

2024-04-23 06:19:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

   /__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。怎么了?你知道吗


Tags: namefrompyimport脚本childobjectinit
2条回答

您对情况的描述遗漏了一个关键部分:这些模块所在的包。例如,如果他们生活在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

我想你只需要做一个空文件

__init__.py 

与文件位于同一目录中。这会让Python2知道可以从这个目录导入。 然后使用你的代码。你知道吗

相关问题 更多 >