Python - 包模块有时作为独立使用时的包内导入?

时间:2016-08-28 11:18:03

标签: python python-3.x package python-import

很抱歉,如果已经使用我不知道要搜索的术语来回答这个问题。

我有一个项目:

project1/
    class1.py
    class2.py

class2class1导入某些内容,但每个内容都有自己的if __name__ == '__main__',它使用我经常运行的各自的类。但是,我有第二个项目,它创建了project1中每个类的子类。所以我希望project1成为一个包,以便我可以很好地将其导入project2

project2/
    project1/
        __init__.py
        class1.py
        class2.py
    subclass1.py
    subclass2.py

然而,我在使用此导入时遇到问题。如果我在project1内部class2.py打包,我会想要使用class1.py导入from project1.class1 import class1代码。这使project2代码正确运行。但是现在当我尝试将project1用作包而不是直接在该目录中运行代码时,project1代码失败(因为它不知道project1是)。如果我将project1设置为直接在该目录中工作(即class2中的导入为from class1 import Class1),则尝试使用project1作为来自project2的包。

有两种方法可以同时使用它(使用project1作为包而不是作为包)?如果有办法,这是一种沮丧的方式,我应该重组我的代码吗?关于我应该如何处理这个问题的其他建议?谢谢!

修改

只是为了澄清,问题是因为subclass2导入class2而导入class1。根据{{​​1}}导入class2的方式,导入将从class1project2失败,因为您将project1视为一个包而另一个将其视为工作目录。

编辑2

我正在使用Python 3.5。显然这适用于Python 2,但不适用于我目前的python版本。

2 个答案:

答案 0 :(得分:1)

编辑2:向class2.py添加了代码,将父目录附加到PYTHONPATH以符合Python3模块导入的工作方式。

import sys
import os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

删除了Class1的相对导入。

文件夹结构:

project2
  - class3.py
  - project1
    - __init__.py
    - class1.py
    - class2.py

项目2 / PROJECT1 / class1.py

class Class1(object):
    def __init__(self):
        super(Class1, self).__init__()
        self.name = "DAVE!"

    def printname(self):
        print(self.name)

def run():
    thingamy = Class1()
    thingamy.printname()

if __name__ == "__main__":
    run()

项目2 / PROJECT1 / class2.py

import sys
import os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

from class1 import Class1

class Class2(Class1):
    def childMethod(self):
      print('Calling child method')

def run():
    thingamy = Class2()
    thingamy.printname()
    thingamy.childMethod()

if __name__ == "__main__":
    run()

项目2 / class3.py

from project1.class2 import Class2
from project1.class1 import Class1

class Class3(Class2):
    def anotherChildMethod(self):
      print('Calling another child method')

def run():
    thingamy = Class3()
    thingamy.printname()
    thingamy.anotherChildMethod()

if __name__ == "__main__":
    run()

通过此设置,class1,2和3中的每一个都可以作为独立脚本运行。

答案 1 :(得分:0)

您可以从class2.py文件夹中运行project2,即将当前工作目录设置为project2文件夹:

user@host:.../project2$ python project1/class2.py

在看起来像这样的窗口上:

C:\...project2> python project1/class2.py

或者你可以修改class2.py内的python路径:

import sys
sys.path.append(".../project2")

from project1.class1 import class1

或者类似地修改PYTHONPATH环境变量。

为了能够扩展您的项目并导入subclass1.py来自subclass2.py的内容,您应该考虑始终使用project2启动导入路径,例如在class2.py中:

from project2.project1.class1 import class1

当然,您需要调整我刚刚显示的方法以匹配新路径。