女士们,先生们,你们好。
请帮助我处理无法识别的文件夹“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运行?
1条答案
按热度按时间iyr7buue1#
乱用
sys.path
是一个非常非常糟糕的想法-根据您所做的,您可能有两种方法导入dev1
等:from devices import dev1
和import dev1
,头痛欲裂。如果您的WSGI环境需要它(例如,您不能通过mod_wsgi设置
chdir
或其他项目根),您可以 * 在WSGI入口点文件中预先添加项目根,例如sys.path.insert(0, "c:/users/pvachal/documents/projekty/grp_exp_structure")
,但在任何情况下都不要 * 添加包(即包含__init__.py
文件的东西)。现在你已经解决了这个问题,你需要将
devices/__init__.py
中的绝对导入改为相对导入,或者提到这个包:同样,修复WSGI文件中webapp的导入:
最后,如果
devices.webapp
包含其他导入,如果devices
在路径上,这些导入将是绝对的,请像上面一样修复它们。一般来说,即使在WSGI上下文之外,您现在也可以使用
grp_exp_structure
目录中的something.py
来测试事情是否正常:这两个导入应该都能正常工作。
(最后,顺便说一句,我建议看看Apache + mod_wsgi以外的东西。