无法从其他文件夹导入Python

我似乎无法得到Python在子文件夹中导入模块。 当我尝试从导入的模块创build类的实例时,出现错误,但是导入本身成功。 这是我的目录结构:

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:'模块'对象没有属性'用户'

我相信你需要在Models目录下创build一个名为__init__.py的文件,以便python将其视为一个模块。

那你可以这样做:

 from Models.user import User 

你可以在__init__.py包含代码(例如几个不同的类需要的初始化代码),或者留空。 但它一定在那里。

您必须在Models子文件夹上创build__init__.py 。 该文件可能是空的。 它定义了一个包。

那你可以这样做:

 from Models.user import User 

在这里阅读python教程的全部内容。

这里还有一篇关于python项目文件组织的好文章。

导入用户

u = user.User()#error这一行

由于缺乏上面提到的__init__,你会期望一个导致问题更清楚的ImportError。

你不会得到一个,因为'用户'也是标准库中的一个现有模块。 您的导入语句抓住了一个,并试图在其中findUser类; 这不存在,只有那么你得到的错误。

通常是一个好主意,使您的import绝对:

 import Server.Models.user 

避免这种歧义。 事实上,从Python 2.7'导入用户'根本不会相对于当前模块。

如果你真的想要相对导入,你可以在Python 2.5中明确地使用它们:

 from .user import User 

你错过了__init__.py。 从Python教程:

需要使用__init__.py文件来使Python将目录视为包含包; 这是为了防止具有通用名称的目录(如string)无意中隐藏稍后在模块searchpath中发生的有效模块。 在最简单的情况下,__init__.py可以只是一个空文件,但也可以执行包的初始化代码,或者设置__all__variables,稍后介绍。

将一个名为__init__.py的空文件放在您的Models目录中,并且全部都是黄金的。

当您没有标准包结构时,导入位于父文件夹的模块的正确方法是:

 import os, sys CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) sys.path.append(os.path.dirname(CURRENT_DIR)) 

(你可以合并最后两行,但这种方式更容易理解)。

这个解决scheme是跨平台的,通用性足以在其他情况下不需要修改。

你怎么写出参数os.path.dirname ….命令?

 import os, sys CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) sys.path.append(os.path.dirname(CURRENT_DIR)) 

glarrain的解决scheme效果最好。 我遇到了Python无法识别我的Python模块的问题,并给了我'模块找不到'的错误。 对我来说,即使添加了__init__.py文件并正确地导入模块,我仍然得到相同的错误。 我按照glarrain的回答解决了这个问题。

我的首选方法是在每个包含被其他模块使用的模块的目录上都有__init__.py,并在入口点覆盖sys.path,如下所示:

 def get_path(ss): return os.path.join(os.path.dirname(__file__), ss) sys.path += [ get_path('Server'), get_path('Models') ] 

这使得指定目录中的文件可以被导入,并且可以从Server.py导入用户。