我在同一位置有三个脚本:
/__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
时,出现以下错误:
导入错误:无法导入名称 radio
我使用python 2.x
。怎么了?
最佳答案
您对情况的描述忽略了一个关键部分:这些模块所在的包。例如,如果它们位于 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
关于Python-导入模块导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41418153/