用于在同一包中进行测试的Python导入

用于在同一包中进行测试的Python导入,python,unit-testing,pydev,Python,Unit Testing,Pydev,我的项目层次结构是这样的 project src fruit_pkg count_fruits.py test fruit_pkg test_count_fruits.py 现在,在模块count\u fruits.py中,我有一个名为addition的函数。为了测试添加,我是否必须使用导入计数模块 my_mod = __import__("fruit_pkg.count_f

我的项目层次结构是这样的

project 
       src
          fruit_pkg
            count_fruits.py
       test
          fruit_pkg
             test_count_fruits.py
现在,在模块
count\u fruits.py
中,我有一个名为
addition
的函数。为了测试
添加
,我是否必须使用导入
计数
模块

my_mod = __import__("fruit_pkg.count_fruits")
cnt_fruit = getattr(my_mod,"count_fruits")
然后在我的测试中,做一些

def my_test(self):
  #some work happen here
  cnt_fruit.addition(blah, blah)
  #more work happen here
或者:由于
src
test
代码都在同一个包中
fruit\u pkg
,是否有更简单的方法访问
count\u fruits
中的函数


对于并行,在Java中,如果
src
和junit测试代码都在同一个包中,则根本不需要导入。

您必须导入该模块(因为这是您在另一个模块的名称空间中获取对该模块或其任何内容的引用的方式),因为测试代码和产品代码在不同的模块中,但是您不必像现在这样复杂。你可以:

from fruit_pkg.count_fruits import count_fruits as cnt_fruit
然后,看起来您的项目可能有一个过于复杂的结构。Python通常喜欢比Java更扁平的组织,因此很有可能将
count\u fruits
方法直接放在
fruit\u mod
模块中,而根本没有
fruit\u pkg
。这将使您的项目更易于导航,并删除import语句中的冗余:

from fruit_mod import count_fruits

在Python中,将一个包拆分为多个路径并不是那么简单。将执行此操作,但要求您将此代码放入包的
\uuuu init\uuuuuu.py

from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
请注意,在
sys.path
(PYTHONPATH)中,仅加载该命名空间的第一个
\uuu init\uu.py
。因此,您应该确保组成包的所有部分的
\uuuu init\uuuu.py
都是相同的

总而言之,这很容易出错,我建议您重新组织代码,并将测试放在它们自己的单独名称空间中。摆弄一个包的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

from src.fruit_pkg.count_fruits import *

除非
fruit\u pkg
是名称空间包;它只能从一个目录中获得。查看
sys.modules['fruit\u pkg']
以找出哪一个

您可以将测试移动到
src/fruit\u pkg/test/test\u count\u fruits.py
,也可以不对测试包使用相同的顶级名称

无论哪种方式,要导入模块:

from fruit_pkg import count_fruits

您是否尝试过从package.SRC.fruit\u pkg.count\u fruits import count\u fruits执行
操作?发布我的问题后,我继续处理导入操作。在我看到你的回答之前,另一个建议让我找到了正确的答案。但我会接受你的回答,因为这是最终答案:
来自水果\包装进口计数\水果
。谢谢。但我必须投票给@Michael Wild,感谢他引导我找到正确的答案,结果是@J.F.Sebastian的答案