我在为从另一个子目录导入类的问题而苦苦挣扎,我找不到令人满意的解决方案。这里是上下文:我有一个根文件夹,我们称之为项目,其中包含两个子文件夹,分别名为app和test。
在应用程序中,我有班级文件class1.py等。在测试中,我有test_class1.py来保存我的单元测试类。对我来说似乎是一些标准的文件夹结构。如何从test_class1.py导入class1?到目前为止,我在sys.path后面附加了“ ../app”,但对我来说看起来很难看!我尝试了from ..app import class1
和许多其他组合,但均未成功。
第二个问题:python 3.6及更高版本中仍需要__init__.py
吗?
谢谢您的帮助
答案 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?
可能有趣的参考: