基本的Python导入机制

时间:2018-09-03 09:07:13

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

我有以下目录树:

project/
  A/
    __init__.py
    foo.py
  TestA/
    __init__.py
    testFoo.py

testFoo的内容是:

import unittest
from A import foo

project目录运行python testA/testFoo.py

我得到一个ModuleNotFoundError No module named A

我有两个问题:如何从TestA.testFoo导入并运行A.foo,为什么在Python中掌握导入逻辑如此困难?没有任何调试技巧可以快速解决此类问题,对不起,我不得不打扰您这些基本问题?

5 个答案:

答案 0 :(得分:1)

首先将文件夹project/testA添加到系统pythonpath:

import sys
sys.path.insert(0, "/path/to/pythonfile")

然后再次尝试导入。

答案 1 :(得分:1)

在执行文件时,将生成一个称为python路径的环境变量,python导入将使用此变量来查找要导入的文件,该路径将与正在执行的文件的路径一起生成,并且它将在当前目录和包含__init__.py文件的子目录,如果要从同一级别的目录导入,则需要修改python路径或更改项目的体系结构,以使执行的文件始终位于顶层。

您可以像这样包含python路径的路径:

import sys
sys.path.insert(0, "/path/to/file.py")

您可以阅读有关导入系统的更多信息:https://docs.python.org/3/reference/import.html

我认为最好的方法是不要触摸python路径,而将测试目录包含到测试文件所在的目录中:

project/
  A/
    __init__.py
    foo.py
    TestA/
        __init__.py
        testFoo.py

然后在您的A或项目目录中运行python -m unittest命令,它将搜索当前目录和子目录以进行测试并执行。

更多有关单元测试的信息:https://docs.python.org/3/library/unittest.html

答案 2 :(得分:1)

你可以试试吗?

在子目录__init__.py中创建一个空文件TestA。并在主代码的开头添加

from __future__ import absolute_import

然后按如下所示导入:

import A.foo as testfoo

答案 3 :(得分:0)

py3中推荐的方式可能如下所示

.your-div{
background-image:url('your-image.png');
background-repeat:no-repeat;
background-size:cover;
background-position:center-center;
margin-top:-25px;
}

Python中执行模块echo $pwd $ /home/user/project python -m testA.testFoo 的方式是替换相对引用的好方法。

答案 4 :(得分:0)

您肯定找不到A,因为python需要从sys.pathPYTHONPATH中查找模块。

Python将自动将当前的top level script添加到sys.path而不是currently directory添加到sys.path。因此,如果您在print(sys.path)中添加testFoo.py,则只会看到将project/TestA添加到sys.path中。

换句话说,project中没有包含sys.path,那么python如何找到模块A

因此,您必须自己将project文件夹添加到sys.path中,而top script才需要这样做,如下所示:

import unittest
import sys
import os
file_path = os.path.abspath(os.path.dirname(__file__)).replace('\\', '/')
lib_path = os.path.abspath(os.path.join(file_path, '..')).replace('\\', '/')
sys.path.append(lib_path)