2016-07-06 73 views
1

我有我试图从一个文件夹的层级下读取自定义模块:Python中没有名为模块

> project-source 
     /tests 
      /provider 
      my_provider.py 
     settings_mock.py 
     __init__.py 

我想打电话,从my_provider.py

import tests.settings_mock as settings 

例从命令行:

project-source> python tests/provider/my_provider.py 

错误:

... ImportError: No module named settings_mock 

我一直得到No module named settings_mock为错误。我已经出口到PYTHONPATH的路径project_source。我已经在其根目录下创建了一个__init__.py文件,然后在错误中没有更改,从而将测试集成到一个包中。

我可以cd'ing项目源

当打印 settings_mock.py属性
>>> import tests.settings_mock as settings 
>>> print settings.storage_provider 
correct storage provider value 

是任何人都可以在这里指出我的错误?谢谢!

+0

如果您的子文件夹是包(即它们包含'__init __。py'),则可以使用相对导入:'from .. import settings_mock' – jbndlr

+0

只需将空** ___ init ___。py **添加到您的测试目录中 – dmitryro

+0

'__init __。py'在哪里? –

回答

1

你只有一个小小的错误。要使用子文件夹,您需要__init__.py,而不是您在问题中陈述的init.py。不同之处在于__init__是python的内置函数,而init则不是。在每个子文件夹中都有这个文件告诉pyhon解释器该文件夹是需要初始化的“包”。

更新:应该指出,python通常从脚本所在的当前目录运行。如果您的可执行主脚本是my_provider.py,那么它不会知道要导入什么,因为主脚本位于比它尝试导入的对象更低的目录中。把它看作是一个层次结构。脚本只能导入它们下面的东西。尝试从该文件中的所有其他文件中分离出可执行文件,如果有需要导入的东西。

+0

对不起,SO问题的格式没有显示,但我写了'__init __。py'(编辑问题显示这),所以这不是问题。 – Jenninha

+1

感谢您的更新。我会看看我是否可以再次重现您的问题。 –

+0

我无法在您的设置中重现问题,而在导入'settings_mock.py'的'project-source'目录中运行main.py。你在哪里运行main.py文件? –

相关问题