我有一个具有这种结构的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
答案 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)
有两个基本问题:
os.getcwd()
,因为其他os
函数返回路径,最后没有分隔符。事实上,您插入的xxx\LiClipse Workspace\SystemTest\ImportTest../../../
不是有效路径
正如@peter所提到的,使用os.getcwd()是个坏主意 - 它取决于您运行脚本时的位置。使用:
sys.path.append(os.path.dirname(__file__))
(insert
仅在特殊情况下推荐)
但是,
似乎没有一个导致你的问题。它只会向您的sys.path
插入不好的内容。您的导入需要正常工作导致从self-module-dir完成所有导入,其中python首先搜索所请求的模块。
我将你的包裹复制到我的机器上 - 两者都运行良好! 我修复了一个拼写错误(RunImport s PersonTest - RunImportPersonTest) - 可能还有其他拼写问题