无法从其他文件夹导入Python

rye*_*guy 84 python

我似乎无法让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(例如,几个不同类需要的初始化代码)中包含代码或将其留空.但它必须在那里.

  • 谢谢,我之前从未听说过包裹. (2认同)
  • 实际上,在导入 Python 时对待 blah.py 和 blah/__init__.py 完全相同。 (2认同)
  • 那是不明显的......我对自己说:RTFM FMF (2认同)
  • 请注意,如果您从另一个目录运行 server.py,这将不起作用。 (2认同)
  • 如果 server.py 在另一个文件夹中怎么办? (2认同)

nos*_*klo 21

您必须__init__.pyModels子文件夹上创建.该文件可能为空.它定义了一个包.

然后你可以这样做:

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)


gla*_*ain 9

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

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)

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

该解决方案是跨平台的,并且通用性足以在其他情况下不需要修改.


Har*_*lby 7

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

需要__init__.py文件才能使Python将目录视为包含包; 这样做是为了防止具有通用名称的目录(例如字符串)无意中隐藏稍后在模块搜索路径上发生的有效模块.在最简单的情况下,__ init__.py可以只是一个空文件,但它也可以执行包的初始化代码或设置__all__变量,稍后描述.

将名为__init__.py的空文件放在Models目录中,所有文件都应该是黄金的.