apache wsgi:error在我的Web应用程序模型中未找到模块错误

ssgvzors  于 2023-03-24  发布在  Apache
关注(0)|答案(1)|浏览(145)

女士们,先生们,你们好。
请帮助我处理无法识别的文件夹“devices”。
我有一个从机器人阅读数据的程序。数据存储在“设备”文件夹中。
我的文件结构:

  • 玻璃钢
    • 装置
      • _ _ init _ _.py
    • *dev1.py
    • *dev2.py
    • *dev3.py
    • *webapp.py
    • 工具
      • _ _ init _ _.py
    • *tool1.py
    • *tool2.py

devices文件夹中_ _ init _ _ .py的内容:

__all__ = ["dev1", "dev2", "dev3"]
from dev1 import Dev1Cls
from dev2 import Dev2Cls
from dev3 import Dev3Cls

www.example.com中有问题的代码部分webapp.py:

from devices import Dev1Cls

Dev 1Cls是www.example.com中的类dev1.py
我有一个flask Webapp(blabla/grp_exp_structure/devices/webapp.py),它的任务是读取数据并显示它们。Webapp从dev 1、dev 2和dev 3读取数据,并通过mod_wsgi从Apache服务器启动。
如果我通过内置的Werkzeug服务器运行应用程序,没有问题。但是如果我通过启动Apache运行应用程序,我会在errorlog中获得异常ModuleNotFoundError:未找到模块错误:没有名为“devices”的模块
wsgi代码:

#! C:/Users/pvachal/AppData/Local/Programs/Python/Python310/python.exe

import sys

sys.path.insert(0, "c:/users/pvachal/documents/projekty/grp_exp_structure/devices")

activate_this = "c:/users/pvachal/documents/projekty/grp_exp_structure/venv/scripts/activate_this.py"
with open(activate_this) as file_:
    exec(file_.read(), dict(__file__=activate_this))

from webapp import Webapp
application = Webapp().app

www.example.com的代码dev1.py(dev 2和dev 3相似)

class Dev1Cls:
    def __init__(self):
        self.value = "dev_number_one"

我需要做些什么来使它工作?我想离开相同的文件系统,我有.是的,我可以改变我的文件的结构,但我想知道如何解决这个问题,而不改变结构.
我想这个问题是由于_ _ init _ 文件没有读取。当我直接运行webapp.py时,一切都很好,因为 _ init _ 文件将启动。我需要做什么才能使它通过wsgi运行而没有问题?是否有可能使 _ init _ _也通过wsgi运行?

iyr7buue

iyr7buue1#

乱用sys.path是一个非常非常糟糕的想法-根据您所做的,您可能有两种方法导入dev1等:from devices import dev1import dev1,头痛欲裂。

如果您的WSGI环境需要它(例如,您不能通过mod_wsgi设置chdir或其他项目根),您可以 * 在WSGI入口点文件中预先添加项目根,例如sys.path.insert(0, "c:/users/pvachal/documents/projekty/grp_exp_structure"),但在任何情况下都不要 * 添加包(即包含__init__.py文件的东西)。

现在你已经解决了这个问题,你需要将devices/__init__.py中的绝对导入改为相对导入,或者提到这个包:

__all__ = ["dev1", "dev2", "dev3"]
from .dev1 import Dev1Cls  # or `from devices.dev1 ...`
from .dev2 import Dev2Cls
from .dev3 import Dev3Cls

同样,修复WSGI文件中webapp的导入:

from devices.webapp import Webapp
application = Webapp().app

最后,如果devices.webapp包含其他导入,如果devices在路径上,这些导入将是绝对的,请像上面一样修复它们。
一般来说,即使在WSGI上下文之外,您现在也可以使用grp_exp_structure目录中的something.py来测试事情是否正常:

import devices
from devices.webapp import Webapp

这两个导入应该都能正常工作。
(最后,顺便说一句,我建议看看Apache + mod_wsgi以外的东西。

相关问题