无法从其他文件夹导入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导入用户。