代码之家  ›  专栏  ›  技术社区  ›  ryeguy

无法从其他文件夹导入python

  •  73
  • ryeguy  · 技术社区  · 17 年前

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

    和用户

    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”

    7 回复  |  直到 9 年前
        1
  •  109
  •   Dana    14 年前

    我相信你需要创建一个名为 __init__.py 在models目录中,以便python将其视为模块。

    然后你可以做:

    from Models.user import User
    

    您可以在 π介子 (例如,一些不同的类需要的初始化代码)或将其留空。但一定在那里。

        2
  •  20
  •   nosklo    17 年前

    你必须创造 __init__.py Models 子文件夹。文件可能为空。它定义了一个包。

    然后你可以做:

    from Models.user import User
    

    在python教程中阅读关于它的所有内容, here .

    还有一篇关于Python项目文件组织的好文章 here .

        3
  •  11
  •   bobince    17 年前

    导入用户

    u=user.user()此行出错

    由于缺乏上述的初始化,您将期望出现一个重要错误,这将使问题更清楚。

    因为“用户”也是标准库中的一个现有模块,所以无法获取。您的import语句将获取该语句并尝试在其中查找用户类;这不存在,只有这样才能得到错误。

    一般来说,最好是绝对进口:

    import Server.Models.user
    

    为了避免这种歧义。实际上,从python 2.7的“import user”来看,它根本就不会与当前模块相关。

    如果您真的想要相对导入,可以在python 2.5和更高版本中显式地使用一些难看的语法:

    from .user import User
    
        4
  •  8
  •   glarrain    13 年前

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

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

    (您可以合并最后两行,但这样更容易理解)。

    这个解决方案是跨平台的,一般情况下不需要修改。

        5
  •  7
  •   UnkwnTech    17 年前

    你失踪了。从python教程:

    _uuu init_uuu.py文件需要 使python将目录视为 包含包;这是为了 阻止具有公用 名称,如字符串,来自 无意中隐藏有效模块 稍后在模块搜索中出现 路径。在最简单的情况下, _ init_uuu.py可以是一个空文件,但也可以执行初始化 包的代码或设置 _所有变量,稍后描述。

    把一个名为uu init_uuu.py的空文件放在models目录中,所有文件都应该是金色的。

        6
  •  1
  •   Michał    11 年前

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

    import os, sys
    CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
    sys.path.append(os.path.dirname(CURRENT_DIR))
    
        7
  •  0
  •   kchoi    9 年前

    我的首选方法是在包含其他模块使用的模块的每个目录上都有uuu init_uuuy.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导入用户。