Python flask应用程序在start ImportError时抛出以下错误:不支持按文件名导入

2024-10-03 15:23:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个flask应用程序从git克隆而来,安装了它的所有需求并启动了该应用程序

$python开始.py在

我得到以下错误

Traceback (most recent call last):
  File "start.py", line 6, in <module>
    app = create_app("local")
  File "C:\Jahangeer\qurbcode\api\app\__init__.py", line 66, in create_app
    from app.api_1_0 import apibp as api_1_0, api_spec as api_1_0_spec
  File "C:\Jahangeer\qurbcode\api\app\api_1_0\__init__.py", line 78, in <module>
    ModuleImport.importModulesFromPath(os.path.dirname(os.path.realpath(__file__)), __name__)
  File "C:\Jahangeer\qurbcode\api\app\helpers\module_import.py", line 16, in importModulesFromPath
    importlib.import_module("." + module, package)
  File "C:\Python27\lib\importlib\__init__.py", line 37, in import_module
    __import__(name)
ImportError: Import by filename is not supported.

在开始.py有以下代码

^{pr2}$

在我的init.py的第66行,上面的错误中提到了以下内容

 # Setup api/1.0 blueprint
    from .api_1_0 import apibp as api_1_0, api_spec as api_1_0_spec
    from .admin import admin_bp as admin
    app.register_blueprint(api_1_0, url_prefix='/api/1.0')

这是应用程序结构

api
->admin_app
->app
  ->admin
  ->api_1_0
  ->__init__.py
->start.py
->manage.py

我的api\app\helpers\module_导入.py有以下代码:

import glob
import importlib


class ModuleImport:

    @staticmethod
    def importModulesFromPath(dir_path, package, import_init = False):
        files = glob.glob(dir_path + "/*.py")
        for file in files:
            module = file.replace(dir_path, "").replace("/", "").replace(".py", "")

            if module == "__init__" and not import_init:
                continue

            importlib.import_module("." + module, package)

在我的应用程序中有以下api\u78行

ModuleImport.importModulesFromPath(os.path.dirname(os.path.realpath(__file__)), __name__)

Tags: pathinpyimportapiapp应用程序admin
2条回答

你的自动装弹机几乎肯定是在做坏事(tm)。在

看起来你的代码是为在Linux上运行而设计的,但你是在Windows上运行的。就其本身而言,这并不一定是坏事,但它的写作方式并不支持这一点。具体地说,glob.glob(dir_path + "/*.py")将返回目录中所有.py文件的路径,它们看起来像C:\\path\\to\\file.py。稍后,链module = file.replace(dir_path, "").replace("/", "").replace(".py", "")将尝试剥离.pyC:\\path\\to部分,留给您\\file,但是{}不会删除前导反斜杠,因为它在寻找正斜杠,而windows使用反斜杠。然后,您将尝试导入\\file,但由于无法将路径传递给__import__函数,因此无法导入\\file函数,这不是其工作原理。在

在短期内,如果您将ModuleImport工具改为在顶部有一个import os,那么您可能会发现所有的东西都会充满活力。然后将dir_path + "/*.py"替换为os.path.join(dir_path, '*.py'),将{}替换为{}。这应该可以解决您当前的问题,但您不应该像这样离开代码。在

从长远来看,这并不是自动加载模块的好方法,如果您在使用importlib来正确加载模块,那么您可能可以用一种更好的方式加载模块。当我看到sys.path.appendimportlib.import之类的东西时,我通常认为这是一种代码气味。如果查看How to load all modules in a folder?,您可能会发现您的代码更易于维护

硬编码路径不是个好主意。在

如果使用的是Python 3,则可以使用pathlib,否则使用os.path.join。在

from pathlib import Path

data_folder = Path("source_data/text_files/")

file_to_open = data_folder / "raw_data.txt"

f = open(file_to_open)

print(f.read())

或者即使您想获取windows路径:

^{pr2}$

相关问题 更多 >