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