我有一个自定义模块,我试图从层次结构下的文件夹中读取:
> 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
视为错误。我已经将project_source
路径导出到PYTHONPATH。我已经通过在其根目录中创建__init__.py
文件对包进行了测试,但是错误没有改变。
我可以在cd'ing项目源
时打印settings_mock.py
属性
>>> import tests.settings_mock as settings
>>> print settings.storage_provider
correct storage provider value
有人能在这里指出我的错误吗?谢谢!
答案 0 :(得分:1)
你只有一个小错误。要使用子文件夹,您需要__init__.py
,而不是问题中所述的init.py
。区别在于__init__
是python的内置函数,而init
则不是。my_provider.py
。在每个子文件夹中都有这个文件告诉pyhon解释器该文件夹是一个"包"需要初始化。
更新:应该注意的是,python通常从脚本所在的当前目录运行。如果您的可执行主脚本是settings_mock
,那么它将不知道要导入什么,因为主脚本位于比它尝试导入的对象更低的目录中。把它想象成一个层次结构。脚本只能导入它们下面的内容。如果有text_file = open("/Users/path/to/file/text.txt", "a")
需要导入的内容,请尝试将可执行文件与该文件中的其他所有内容分开。