从子文件夹导入子类

时间:2014-11-22 20:04:49

标签: python python-3.4

Python新手我尝试设置文件,文件夹和类的简单OOP结构。以下是文件路径:

  • C:\用户\ Mc_Topaz \ Programmering \的Python \终端\ Main.py
  • C:\用户\ Mc_Topaz \ Programmering \的Python \终端\连接\ Connection.py
  • C:\用户\ Mc_Topaz \ Programmering \的Python \终端\连接\ NoConnection.py

注意 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。

4 个答案:

答案 0 :(得分:1)

要使python识别目录是modulepython个文件的集合,该目录必须包含名为__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.py
  • 中的类连接= Foo
  • > NoConnection.py
  • 中的NoConnection = Bar

这确保如果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 文件。

这是一个错误吗?