我似乎无法让Python在子文件夹中导入模块.当我尝试从导入的模块创建类的实例时,我收到错误,但导入本身成功.这是我的目录结构:
Server -server.py -Models --user.py
这是server.py的内容:
from sys import path from os import getcwd path.append(getcwd() + "\\models") #Yes, i'm on windows print path import user u=user.User() #error on this line
和user.py:
class User(Entity): using_options(tablename='users') username = Field(String(15)) password = Field(String(64)) email = Field(String(50)) status = Field(Integer) created = Field(DateTime)
错误是:AttributeError:'module'对象没有属性'User'
我相信你需要创建一个__init__.py
在Models目录中调用的文件,以便python将其视为一个模块.
然后你可以这样做:
from Models.user import User
您可以在__init__.py
(例如,几个不同类需要的初始化代码)中包含代码或将其留空.但它必须在那里.
您必须__init__.py
在Models
子文件夹上创建.该文件可能为空.它定义了一个包.
然后你可以这样做:
from Models.user import User
阅读所有关于它在python教程,这里.
还有关于Python项目的文件组织好文章在这里.
导入用户
u = user.User()#error在这一行
由于缺少上面提到的__init__,你会发现一个ImportError可以使问题更加清晰.
你没有得到一个,因为'user'也是标准库中的现有模块.你的import语句抓住那个并尝试在其中找到User类; 那是不存在的,只有这样才能得到错误.
通常一个绝对的导入是一个好主意:
import Server.Models.user
避免这种模棱两可.事实上,从Python 2.7'导入用户'看起来根本不会与当前模块相关.
如果你真的想要相对导入,你可以在Python 2.5中使用稍微丑陋的语法显式地使用它们:
from .user import User
当您没有标准包结构时,导入位于父文件夹的模块的正确方法是:
import os, sys CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) sys.path.append(os.path.dirname(CURRENT_DIR))
(您可以合并最后两行,但这种方式更容易理解).
该解决方案是跨平台的,并且通用性足以在其他情况下不需要修改.
你错过了__init__.py.从Python教程:
需要__init__.py文件才能使Python将目录视为包含包; 这样做是为了防止具有通用名称的目录(例如字符串)无意中隐藏稍后在模块搜索路径上发生的有效模块.在最简单的情况下,__ init__.py可以只是一个空文件,但它也可以执行包的初始化代码或设置__all__变量,稍后描述.
将名为__init__.py的空文件放在Models目录中,所有文件都应该是黄金的.