当前位置:  开发笔记 > 编程语言 > 正文

无法从其他文件夹导入Python

如何解决《无法从其他文件夹导入Python》经验,为你挑选了5个好方法。

我似乎无法让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'



1> Dana..:

我相信你需要创建一个__init__.py在Models目录中调用的文件,以便python将其视为一个模块.

然后你可以这样做:

from Models.user import User

您可以在__init__.py(例如,几个不同类需要的初始化代码)中包含代码或将其留空.但它必须在那里.


谢谢,我之前从未听说过包裹.
那是不明显的......我对自己说:RTFM FMF

2> nosklo..:

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

然后你可以这样做:

from Models.user import User

阅读所有关于它在python教程,这里.

还有关于Python项目的文件组织好文章在这里.



3> bobince..:

导入用户

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

由于缺少上面提到的__init__,你会发现一个ImportError可以使问题更加清晰.

你没有得到一个,因为'user'也是标准库中的现有模块.你的import语句抓住那个并尝试在其中找到User类; 那是不存在的,只有这样才能得到错误.

通常一个绝对的导入是一个好主意:

import Server.Models.user

避免这种模棱两可.事实上,从Python 2.7'导入用户'看起来根本不会与当前模块相关.

如果你真的想要相对导入,你可以在Python 2.5中使用稍微丑陋的语法显式地使用它们:

from .user import User



4> glarrain..:

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

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

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

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



5> Harper Shelb..:

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

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

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

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有