如何以优雅的方式导入自己的模块?

时间:2018-07-30 10:43:01

标签: python-3.x

我在为从另一个子目录导入类的问题而苦苦挣扎,我找不到令人满意的解决方案。这里是上下文:我有一个根文件夹,我们称之为项目,其中包含两个子文件夹,分别名为app和test。

在应用程序中,我有班级文件class1.py等。在测试中,我有test_class1.py来保存我的单元测试类。对我来说似乎是一些标准的文件夹结构。如何从test_class1.py导入class1?到目前为止,我在sys.path后面附加了“ ../app”,但对我来说看起来很难看!我尝试了from ..app import class1和许多其他组合,但均未成功。

第二个问题:python 3.6及更高版本中仍需要__init__.py吗? 谢谢您的帮助

3 个答案:

答案 0 :(得分:0)

您可以在test_class1.py

中执行以下操作
import os
import sys
import unittest

parent_dir = "/".join(sys.path[0].split("/")[:-1])    # On Linux
parent_dir = "\\".join(sys.path[0].split("\\")[:-1])  # On Windows

sys.path.append(parent_dir)

from app import class1

## bla bla

当您致电test_class1.py时,您需要执行以下操作:

python -m test.test_class1

答案 1 :(得分:0)

__init__.py

您不需要{{1}}即可从3.3+版本创建软件包。

答案 2 :(得分:0)

1 /关于您的第一个问题,根据我的经验,我将按照以下方式构建项目:

project/
  app/
   class1.py
   __init__.py
   ...
  test/
   context.py
   test_class1.py
   __init__.py
   ...
  setup.py
  ...
  

显然,这些测试模块必须导入打包的模块以进行测试   它。您可以通过以下几种方法执行此操作:

     
      
  • 期待要在站点软件包中安装的软件包。
  •   
  • 使用简单(但明确)的路径修改来正确解析程序包。
  •   
     

我强烈推荐后者。要求开发人员运行setup.py   开发测试不断变化的代码库也需要他们   为每个代码库实例设置隔离的环境。

     

要为各个测试导入上下文,请创建一个tests / context.py   文件:

context.py * 应该引导测试上下文,如下所示:

import sys
import os

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

import app
from app import class1
... 

然后在您的test_class1.py文件中,将导入经过测试的Class如下:

from unittest import TestCase
from .context import class1  # or from context.class1 import MyClass

class TestClass1(TestCase):

    def setUp(self):
        self.to_be_tested = class1.MyClass() # or MyClass()

2 /关于您在python 3.6及更高版本中是否需要 __ init __。py 文件的第二个问题,我让您阅读以下现有答案: Is __init__.py not required for packages in Python 3?

可能有趣的参考