【问题标题】:Attempted relative import in non-package尝试在非包中进行相对导入
【发布时间】:2014-02-28 16:29:30
【问题描述】:

我的项目中有以下结构:

+main_proj

    +modules
        +user_ops
            -add_user.py
            -remove_user.py
            -__init.py
    +common
        -user_operations.py
        -__init__.py
    -main.py
    -__init__.py

我的问题是add_user.pyremove_user.py 都依赖于user_operations,当我尝试调用它们时,我收到relative import in non-package 错误。

Main.py

from common import user_operations as user_operations  #This works ok

if __name__ == '__main__':

    command = "remove_user"

    #Load usage, functions and paths to modules
    __doc__, function_dictionary, modules = utilities.load_modules()

    #Get function from dictionary
    func = function_dictionary[command]

    #Execute function
    result = func(api_root, arguments, simulate, headers)

func(api_root, arguments, simulate, headers)调用的模块

remove_user_front.py

from ...common import user_operations as user_operations

    def remove_user_front(api_root, arguments, simulate, headers):

        #Get users in this account
        users = user_operations.get_users(api_root, arguments["<source_account>"], headers)

        #This is smelly
        if arguments["--id"]:
            type = "id"
        elif arguments["--username"]:
            type = "username"
        #End smell

        result = remove_user(api_root, arguments["<source_account>"], arguments["<user_id>"], type, simulate, headers)

        if not result:
            return False
        else:
            return True

    function_dictionary = {"remove_user" : remove_user_front}

错误

Traceback (most recent call last):
  File "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensio
ns\Microsoft\Python Tools for Visual Studio\2.0\visualstudio_py_util.py", line 7
6, in exec_file
    exec(code_obj, global_variables)
  File "C:\Users\mryan\Documents\Code\cli\cli_front.py", line
 70, in <module>
    recovery.start_recovery(recovery_file, auto_recovery, headers, modules)
  File "C:\Users\mryan\Documents\Code\cli\recovery.py", line 1
01, in start_recovery
    imported_module = imp.load_source('recovery',module)
  File "C:\Users\mryan\Documents\Code\cli\modules\cam_ops\
remove_user_front.py", line 1, in <module>
    from ...common import user_operations as user_operations
ValueError: Attempted relative import in non-package

有人知道我如何保持文件结构并启用modules 下的模块以使用common 下的模块吗?

【问题讨论】:

  • 您是否尝试使用-m 开关?要启动add_userpython -m main_proj.modules.add_user,显然你应该在main_proj 目录之外执行此操作。

标签: python python-import python-module


【解决方案1】:

当您的应用程序启动时,它会获得一个 os.path 属性。

尝试导入任何内容的每个模块都将具有相同的路径。这意味着您需要从 user_ops 中导入某些内容的共同文件将需要导入它,就像您的 main.py 将导入它们一样。

试试

from modules.user_ops import add_user

在您的用户操作中

【讨论】:

  • 我想我可以通过添加:import common.user_operations as user_operations 到我的remove_user_front.pyadd_user_front.py 的顶部
猜你喜欢
  • 2019-05-25
  • 2014-01-02
  • 1970-01-01
  • 2015-12-08
  • 2014-11-14
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多