【问题标题】:importing from folder in same package in python从python中同一包中的文件夹导入
【发布时间】:2018-12-17 02:07:45
【问题描述】:

我在views.py中使用金字塔

from pyramid.response import Response
from pyramid.view import view_config
import os
import uuid
import shutil
import hashlib
from .service.fun import *

def forservo():
    return "HAppy HERE"


@view_config(route_name='home',request_method='GET')
def home(request):
    return Response('html')

在 fun.py 中

from ..views import *

print forservo()

它会抛出错误,提示名称“forservo”未定义

文件夹结构是

myapp
  myapp
  service
    __init__.py
    fun.py
  __init__.py
  views.py

【问题讨论】:

  • 你的主文件夹树?
  • @ChihebNexus 在 que 中添加了文件夹树
  • 您正在尝试进行循环导入。 views.py 可以从 fun.py 导入或 fun.py 可以从视图导入,但不能同时导入。
  • @StevePiercy 但我需要两个文件相互导入没有办法吗?
  • 您可以使用循环导入,但 IMO 不应该。而是查看@Sergey 或stackoverflow.com/questions/22187279/python-circular-importing 的回答

标签: python-2.7 pyramid


【解决方案1】:

您有一个从 views.py 导入的 cyclic import - fun.py 和从 fun.py 导入的 views.py

在这种情况下,事情大致是这样发生的:

  • Python 打开views.py 并执行到from .service.fun import * 这一行

  • 然后它必须停止执行views.py并打开fun.py

  • fun.py 的第一行告诉它停止并导入views.py

  • import 语句返回尚未定义forservo 函数的部分执行模块。

循环导入可以通过将 fun.py 和 views.py 所需的通用代码位移动到单独的模块中来解决。一个不太优雅的解决方案是将一些导入移动到导致循环导入错误的函数下方,或者将它们本地化到需要导入的函数中。

【讨论】:

    【解决方案2】:

    在这个文件夹结构中

    myapp
      myapp 
       service
       __init__.py
       fun.py
      __init__.py
      views.py
    

    views.py 的内容在哪里

    from pyramid.response import Response
    from pyramid.view import view_config
    import os
    import uuid
    import shutil
    import hashlib
    from .service.fun import *
    
    def forservo():
        return "HAppy HERE"
    
    
    @view_config(route_name='home',request_method='GET')
    def home(request):
        return Response('html')
    

    那么fun.py中的import语句为:

    from myapp.views import forservo()
    
    print forservo()
    

    这将打印“HAppy HERE”

    【讨论】:

    • 我添加了文件夹结构,它完全相反
    • ImportError: cannot import name forservo
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 2017-10-07
    相关资源
    最近更新 更多