Python 2.7 在python中从同一包中的文件夹导入

Python 2.7 在python中从同一包中的文件夹导入,python-2.7,pyramid,Python 2.7,Pyramid,我正在views.py中使用pyramid 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',r

我正在views.py中使用pyramid

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')
开玩笑

from ..views import *

print forservo()
如果未定义名称“forservo”,则会引发错误

文件夹结构是

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

在此文件夹结构中

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”

您有一个-
fun.py
views.py
导入和
views.py
fun.py
导入

在这种情况下,情况大致如下:

  • Python打开
    views.py
    并从.service.fun import*

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

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

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


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

您的主文件夹树?@ChihebNexus在Queen中添加了文件夹树。您正在尝试进行循环导入。views.py可以从fun.py导入,或者fun.py可以从视图导入,但不能同时从两个视图导入。@StevePiercy但我需要两个文件相互导入。没有办法吗?您可以使用循环导入,但在我看来不应该。相反,请看@Sergey或我添加的文件夹结构的答案,它与ImportError完全相反:无法为Servo导入名称