Python新手我尝试设置文件,文件夹和类的简单OOP结构。以下是文件路径:
注意 Connection.py 和 NoConnection.py 在子文件夹 Connections 中被隐藏。
Connection.py
class Connection:
def __init__(self):
pass
def ToString(self):
pass
NoConnection.py
from Connection import Connection
class NoConnection(Connection):
def __init__(self):
pass
def ToString(self):
print("No connection")
在 Main.py 文件中,我想从每个类中调用 ToString()方法。
Main.py
from Connections.Connection import Connection
from Connections.NoConnection import NoConnection
connection = Connection()
print(connection.ToString())
noConnection = NoConnection()
print(noConnection.ToString())
当我运行 Main.py 文件时,我收到此错误:
C:\ Users \ Mc_Topaz \ Programmering \ Python \ Terminal> Main.py Traceback (最近一次调用最后一次):文件 " C:\ Users \ Mc_Topaz \ Programmering \ Python \ Terminal \ Main.py",第2行,in 来自Connections.NoConnection导入NoConnection
文件 " C:\用户\ Mc_Topaz \ Programmering \的Python \终端\连接\ NoConnection.py&#34 ;, 第1行,in 来自连接导入连接
ImportError:没有名为' Connection'
的模块
似乎解释器无法在 Main.py 文件中导入 NoConnection 类,因为它无法导入 Connection 类。 NoConnection.py 文件。 我可以分别运行 Connection.py 和 NoConnection.py 而没有任何问题。
我不明白为什么 Main.py 不会运行。我认为这是一个非常简单的东西,我不能看到它,因为我要将它变成绿色到Python。
答案 0 :(得分:1)
要使python
识别目录是module
或python
个文件的集合,该目录必须包含名为__init__.py
的文件。该文件不需要包含任何代码,尽管它可以。如果将此文件添加到Connections目录,则解释器应该能够导入包含的文件。
答案 1 :(得分:0)
只是添加 mobiusklein 提到的内容:__init__.py
的常见做法是导入最常用的对象,以避免导入过程中的冗余。在您的示例中,Connections\__init__.py
可能包含:
import Connection
import NoConnection
然后您的Main.py
可以成功使用以下导入语句:
from Connections import Connection, NoConnection
答案 2 :(得分:0)
我认为这取决于Python 3中的相对导入。
将NoConnection中的导入行更改为显式...
from Connections.Connection import Connection
它适用于Python3(它在Python2中的任何一种方式都有效)。终端的路径可能必须在您的PYTHONPATH环境变量上。
“Python 3完全禁用隐式相对导入;导入现在总是被解释为绝对导入,这意味着在上面的示例中,导入baz将始终导入顶级模块。您必须使用显式导入语法(来自。进口巴兹)。“从这里https://softwareengineering.stackexchange.com/questions/159503/whats-wrong-with-relative-imports-in-python
因此,当您从NoConnection导入Connection时,它将在终端级别而不是终端/连接级别进行查找。
答案 3 :(得分:0)
UPDTAE:阅读此帖子的评论,因为它包含解决方案。
仍然没有让这个工作。但我做了一些改变:
更改了课程名称
这确保如果Connection是模块或类,解释器不会混淆。
删除了ini.py文件
我删除了Connections \ __ init_.py文件,因为在Python 3.4.2版本中这似乎不是必需的。
文件仍然单独运行
我可以分别运行 Connection.py 和 NoConnection.py 。所以他们工作。
<强> Main.py 强>
from Connections.NoConnection import Bar
noConnection = Bar()
print(noConnection.ToString())
运行 Main.py 时,我在第1行遇到同样的错误: “无法在第1行的NoConnection.py中找到模块'连接'。
我能看出为什么会发生这种错误的唯一合理原因是:
当Python从该文件夹启动时,解释器会在 Terminal 文件夹中查找 Connection.py 。即使它从 Connection.py 所在的 Connections 文件夹中导入 NoConnection.py 文件。
这是一个错误吗?