Python 3:从父目录中的Python文件导入函数
我是单元测试新手,我正在尝试用Python3创建我的第一个单元测试文件。因此,我有以下真正基本的文件夹结构,只是模仿一个在线课程Python 3:从父目录中的Python文件导入函数,python,python-3.x,Python,Python 3.x,我是单元测试新手,我正在尝试用Python3创建我的第一个单元测试文件。因此,我有以下真正基本的文件夹结构,只是模仿一个在线课程 D:\Projects\Projects\unit_testing_course # parent dir absolute path unit_testing_course/ # root/parent folder first_project.py # has a fu
D:\Projects\Projects\unit_testing_course # parent dir absolute path
unit_testing_course/ # root/parent folder
first_project.py # has a function called avg()
tests/
test_first_project.py # I want to import avg() into this file
test_first_project.py是我用于单元测试的文件,我想从first_project.py导入avg()函数,它存在于它上面的父目录中
我在windows 10上,我将git bash打开到以下路径:'/d/Projects/Projects/unit_testing_course'(即,包含first_project.py的父目录,我正试图导入tests子目录中的test_first_project.py文件的模块/函数)。我一直在运行python测试/test\u first\u project.py
我很快发现我不能用像这样的东西
”“从。。从导入第一个\u项目“或”。。导入平均值”,这会导致“ValueError:尝试在顶级包之外进行相对导入”错误消息
因此,通过阅读文档,我发现“from”和“import”都是用于处理模块或包的指令。
“Python有一种方法可以将定义放在文件中,并在文件中使用它们
脚本或解释器的交互实例中。如文件
称为模块;模块中的定义可以导入到
其他模块或进入主模块(变量集合
在顶层执行的脚本中以及在
计算器模式)
模块是包含Python定义和语句的文件
文件名是附加后缀.py的模块名
模块,模块的名称(作为字符串)作为
全局变量名为
因此,就Python3而言,每个.py文件都是一个模块,模块名本质上是.py文件名,末尾没有.py扩展名。听起来好像我正试图从test_first_project.py文件的父目录导入一个模块
该文档链接似乎有助于解释这样一种场景:在当前目录中有一个模块,您正在从中执行程序/pythonshell,并且您正在尝试将该模块中的函数导入该程序
但在本例中,我们似乎需要实际告诉python在特定目录(test_first_project.py文件的父目录)中查找名为“first_project”的模块。我看了模块搜索路径部分
导入名为spam的模块时,解释器首先搜索具有该名称的内置模块。如果未找到,它将在变量sys.path给定的目录列表中搜索名为spam.py的文件。
初始化后,Python程序可以修改sys.path。包含正在运行的脚本的目录位于搜索路径的开头,位于标准库路径的前面
然后我试着
import sys
import os
p_dir_path = os.path.abspath('../')
sys.path.append(p_dir_path)
from first_project import avg
这仍然会得到相同的错误消息“ValueError:尝试在顶级包之外进行相对导入”。我希望通过编程修改sys.path可以改变一切
那么,为了从父目录导入模块,我实际上需要做什么呢?
或在python中不可能做到这一点吗?我是否需要使用包而不是模块(即,我是否需要在父目录中创建init.py)
我在stackoverflow上看到过关于尝试将文件导入不同目录的其他问题和帖子以及其他情况,但模仿这些问题的语法对我没有帮助,我认为我在这方面花费了太多时间。我还确信,我不是唯一一个想创建单元测试并被导入语句、模块和包问题所困扰的人。您应该为您的项目适当地设置
PYTHONPATH
变量。在单元测试课程中运行
export PYTHONPATH=$(pwd)
在你的壳里。考虑下面的代码:
first_project.py
tests/test\u first\u project.py
tests/\uuuu init\uuuuu.py
运行
python-m unittest测试将根据需要工作(只要python
指向所需的python版本)。您还可以使用virtualenv
并修改其venv/bin/activate
自动执行此路径设置。当您的项目继续增长时,我建议在基本目录中有两个单独的目录——一个用于项目本身,另一个用于测试。然后分别使用。这将使你的项目变得灵活,如果你选择它,或者把它作为一个工具或类似的东西使用 从父目录运行它:python tests/test\u first\u project.py
或只需python-m unittest
。可能需要一个tests/\uuuu init\uuuu.py
。有趣的是,我已经在这么做了。我让git bash打开/d/Projects/Projects/unit_testing_course,继续使用“python tests/test_first_project.py”,但我遇到了这些错误。您编写了大量文本,但显示的代码很少。我在父目录(unit_testing_course)和子目录(unit_testing_course/tests/)中都有init.py。来自first\u项目导入平均值的仍然失败,并显示消息ModuleNotFoundError:没有名为“first\u项目”的模块
。是的,我知道这里有很多文本,我可能把这个问题复杂化了。在这一点上,我真的对python包和模块感到困惑,即使只是为了从不同的目录中获取函数这一相对简单的任务。对于这个问题,我没有超过我真正包含的5行代码。
def avg(l):
return sum(l)/len(l) if len(l) > 0 else 0
import unittest
from first_project import avg
class Test(unittest.TestCase):
...
from .test_first_project import *