Python flask application throws the following error on start ImportError: Import by filename is not supported
Python flask application throws the following error on start ImportError: Import by filename is not supported
我安装了所有要求并通过
启动应用程序后,从 git 克隆了一个烧瓶应用程序
$pythonstart.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.
Start.py有如下代码
import os
from app import create_app
app = create_app("local")
if __name__ == '__main__':
app.run(host= '0.0.0.0', threaded=True)
and Inside my init.py on the line 66 which is mentioned in above error has following
# 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_import.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\app\api_1_0__init__.py 有以下代码:第 78 行
ModuleImport.importModulesFromPath(os.path.dirname(os.path.realpath(__file__)), __name__)
您的自动加载器几乎肯定在做坏事(tm).
看起来您的代码设计为 运行 Linux,但您 运行 在 Windows 上使用它。就其本身而言,这不一定是坏事,但它的编写方式并不支持这一点。具体来说,glob.glob(dir_path + "/*.py")
返回目录中所有 .py
文件的路径,它们看起来像 C:\path\to\file.py
。稍后,链 module = file.replace(dir_path, "").replace("/", "").replace(".py", "")
将尝试删除 .py
和 C:\path\to
部分,留下 \file
,但 .replace('/', '')
不会删除前导反斜杠,因为它正在寻找正斜杠,而 windows 使用反斜杠。然后您将尝试导入 \file
,您不能这样做,因为您无法将路径传递给 __import__
函数 - 这不是它的工作方式。
在短期内,如果您将 ModuleImport
工具更改为顶部有一个 import os
,您可能会发现一切都变得栩栩如生。然后将 dir_path + "/*.py"
替换为 os.path.join(dir_path, '*.py')
,将 replace("/", "")
替换为 replace(os.sep, "")
。这应该可以解决您眼前的问题,但您不应该那样保留代码。
从长远来看,这不是自动加载模块的好方法,如果您正在使用 importlib 来正确加载模块,您可能会以更好的方式加载模块。当我看到 sys.path.append
或 importlib.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 路径:
from pathlib import Path, PureWindowsPath
filename = PureWindowsPath("source_data\text_files\raw_data.txt")
correct_path = Path(filename)
print(correct_path)
# "source_data/text_files/raw_data.txt" on Mac and Linux
# "source_data\text_files\raw_data.txt" on Windows
我安装了所有要求并通过
启动应用程序后,从 git 克隆了一个烧瓶应用程序$pythonstart.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.
Start.py有如下代码
import os
from app import create_app
app = create_app("local")
if __name__ == '__main__':
app.run(host= '0.0.0.0', threaded=True)
and Inside my init.py on the line 66 which is mentioned in above error has following
# 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_import.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\app\api_1_0__init__.py 有以下代码:第 78 行
ModuleImport.importModulesFromPath(os.path.dirname(os.path.realpath(__file__)), __name__)
您的自动加载器几乎肯定在做坏事(tm).
看起来您的代码设计为 运行 Linux,但您 运行 在 Windows 上使用它。就其本身而言,这不一定是坏事,但它的编写方式并不支持这一点。具体来说,glob.glob(dir_path + "/*.py")
返回目录中所有 .py
文件的路径,它们看起来像 C:\path\to\file.py
。稍后,链 module = file.replace(dir_path, "").replace("/", "").replace(".py", "")
将尝试删除 .py
和 C:\path\to
部分,留下 \file
,但 .replace('/', '')
不会删除前导反斜杠,因为它正在寻找正斜杠,而 windows 使用反斜杠。然后您将尝试导入 \file
,您不能这样做,因为您无法将路径传递给 __import__
函数 - 这不是它的工作方式。
在短期内,如果您将 ModuleImport
工具更改为顶部有一个 import os
,您可能会发现一切都变得栩栩如生。然后将 dir_path + "/*.py"
替换为 os.path.join(dir_path, '*.py')
,将 replace("/", "")
替换为 replace(os.sep, "")
。这应该可以解决您眼前的问题,但您不应该那样保留代码。
从长远来看,这不是自动加载模块的好方法,如果您正在使用 importlib 来正确加载模块,您可能会以更好的方式加载模块。当我看到 sys.path.append
或 importlib.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 路径:
from pathlib import Path, PureWindowsPath
filename = PureWindowsPath("source_data\text_files\raw_data.txt")
correct_path = Path(filename)
print(correct_path)
# "source_data/text_files/raw_data.txt" on Mac and Linux
# "source_data\text_files\raw_data.txt" on Windows