我正在使用Python 2.7。我有以下目录结构:
alogos
- resources
- __init__.py
- test.py
- lib
- __init__.py
- utils.py
- common
- config
- config.json
我的utils.py如下:
def read_json_data(filename):
with open(filename) as data:
json_data=json.load(data)
return json_data
我的test.py
有以下内容:
from lib.utils import read_json_data
running_data = read_json_data('common/config/config.json')
print running_data
当我尝试从python test.py
目录运行resources
时,出现以下错误:
ImportError: No module named lib.utils
访问文件和模块的正确方法是什么
答案 0 :(得分:2)
您的lib.utils
模块不在当前目录中(显然不在其他任何地方进行import
检查),因此import
失败。
Python doc详细说明了模块搜索路径:
当导入名为spam的模块时,解释器首先进行搜索 对于具有该名称的内置模块。如果没有找到,则搜索 对于由。给出的目录列表中名为spam.py的文件 变量sys.path。 sys.path从这些位置初始化:
* the directory containing the input script (or the current directory). * PYTHONPATH (a list of directory names, with the same syntax as the shell variable PATH). * the installation-dependent default.
初始化后,Python程序可以修改sys.path。该 包含正在运行的脚本的目录放在开头 搜索路径的位置,在标准库路径之前。这意味着 将加载该目录中的脚本而不是模块 库目录中的名称相同。这是一个错误,除非 打算替换。有关更多信息,请参见标准模块 信息。
虽然这当然不是唯一的方法,但我要做的是将lib.utils
模块作为单独的模块存储在本地 Pypi 服务器中( Artifactory 就是一个例子,但还有其他一些例子,比如 devpi ,你可以像其他任何模块一样安装它,只是来自普通Pypi的不同索引URL。这样,你的任何脚本都可以像任何其他模块一样使用它,并且它不需要玩各种与路径相关的游戏,这会增加不必要的复杂性。