没有命名的模块

时间:2015-07-21 22:29:07

标签: python

我有一个具有这种结构的python项目:(这不是一个真正的项目,仅用于测试)

ImportTest
    ImportPersonsTest\
        ImportPerson\
            ImportPerson.py
        RunImportPersonTest.py
    RunImportTests.py

我希望这些测试互相调用。例如: RunImportTests.py调用RunImportPersonTest.py中的方法,RunImportPersonTest.py调用方法ImportPerson.py

RunImportPersonTest:

import os
import sys
sys.path.insert(0, os.getcwd() + "../../../")
from ImportPerson import ImportPerson

RunImportTests

import os
import sys
sys.path.insert(0, os.getcwd() + "../../")
from ImportPersonsTest import RunImportsPersonTest

我运行ImportPerson.py和RunImportPersonTest.py时取得了成功,但是当我尝试运行RunImportTests时出现此错误:

    Traceback (most recent call last):
  File "xxx\LiClipse Workspace\SystemTest\ImportTest\RunImportTests.py", line 4, in <module>
    from ImportPersonsTest import RunImportsPersonTest
  File "xxx\LiClipse Workspace\SystemTest\ImportTest\ImportPersonsTest\RunImportsPersonTest.py", line 4, in <module>
    from ImportPerson import ImportPerson
ImportError: No module named 'ImportPerson'

有什么建议吗?

修改

新结构

ImportTest
        ImportPersonsTest\
            ImportPerson\
                ImportPerson.py
                __init__.py
            RunImportPersonTest.py
            __init__.py
        RunImportTests.py
        __init__.py

3 个答案:

答案 0 :(得分:3)

您的项目中似乎没有__init__.py个文件。 Python需要这些文件才能从文件夹中导入模块。好消息是,它们很容易制作:大多数时候,它们不需要任何东西,它们只需要存在。

请参阅:https://docs.python.org/2/tutorial/modules.html#packages

答案 1 :(得分:0)

我认为你对os.getcwd()的使用是有缺陷的。

我的猜测是您从ImportTest目录运行程序,因此您当前的工作目录已经允许您进行第一次导入而无需修复路径。然后,当您尝试第二次导入时,添加&#34; ... / ImportTest /../../.."或&#34; ... / ImportTest /../.."并没有帮助Python找到它。

要修复此问题,请将ImportPersonsTest目录添加到您的路径中,或在导入中使用经过适当修改的名称(确保您已将 init 文件标记为已标记) - 例如

from ImportPersonsTest.ImportPerson import ImportPerson

答案 2 :(得分:0)

有两个基本问题:

  1. os.getcwd(),因为其他os函数返回路径,最后没有分隔符。事实上,您插入的xxx\LiClipse Workspace\SystemTest\ImportTest../../../ 不是有效路径

  2. 正如@peter所提到的,使用os.getcwd()是个坏主意 - 它取决于您运行脚本时的位置。使用: sys.path.append(os.path.dirname(__file__))insert仅在特殊情况下推荐)

  3. 但是,

    似乎没有一个导致你的问题。它只会向您的sys.path插入不好的内容。您的导入需要正常工作导致从self-module-dir完成所有导入,其中python首先搜索所请求的模块。

    我将你的包裹复制到我的机器上 - 两者都运行良好! 我修复了一个拼写错误(RunImport s PersonTest - RunImportPersonTest) - 可能还有其他拼写问题