无法从其他文件夹导入模块

Cannot import modules from other folders

我目前在从我的 python 项目中的其他目录导入文件时遇到问题。

我当前的文件结构是

Project
 - Backend
     - Config
         + __init__.py
         + databaseConfig.py  
     - DataAccess
         + __init__.py
         + sqlConns.py
     - __init__.py
     - api.py
     - main.py
     - setup.py
   

我想做的是将 /Config/databaseConfig.py 文件导入 /DataAccess/sqlConns.py 文件。尝试 运行 sqlConns.py 文件

时出现以下错误
PS C:\source\repos\aaStats\aaStats> py .\Backend\DataAccess\sqlConns.py      
Traceback (most recent call last):
  File "C:\source\repos\aaStats\aaStats\Backend\DataAccess\sqlConns.py", line 2, in <module>
    import Config.databaseConfig
ModuleNotFoundError: No module named 'Config'

我也试过使用相对导入,但我遇到了另一个错误。

PS C:\source\repos\aaStats\aaStats> py .\Backend\DataAccess\sqlConns.py      
Traceback (most recent call last):
  File "C:\source\repos\aaStats\aaStats\Backend\DataAccess\sqlConns.py", line 2, in <module>
    from ..Config import databaseConfig as dbcfg
ImportError: attempted relative import with no known parent package

Config/databaseConfig.py 包含我想引用的数据库配置参数是我项目中的各个地方。如果我必须移动这个单个文件以使其被正确引用,这不是什么大不了的事情,但我希望稍后在我的项目中对文件使用这样的结构。

以下是有关我的文件的一些详细信息:

/Config/__init__.py

from . import databaseConfig

/DataAccess/__init__.py

from . import sqlConns

Backend/__init__.py

from . import DataAccess
from . import Config

Backend/setup.py

from setuptools import setup, find_packages

setup(
    name='aaStatsApi',
    version='0.1.0',
    packages= ['DataAccess','Config'],
    install_requires=[
        'fastapi==0.63.0',
        'uvicorn==0.13.4',
        'requests==2.25.1',
        'pyodbc==4.0.30',
    ]
)
  1. 查看 this post
  2. 您无法如此轻松地执行相对导入这一事实是设计使然,无论是好是坏。理想的方法是将主脚本放在根 (Backend) 目录中,然后从那里进行所有调用。具有 __name__ == __main__ 的函数是您的调用函数。如果您不直接从控制台调用Calls.pyConfigs.py,而是从另一个main函数调用它们你的根目录,你应该能够将以下内容放入 Conns.py:
# FILE: DataAcess\sqlConns.py
from Config.dataBaseConfig import * # or whatever you need to import

同样,关键是要确保您的起点是从您的项目根目录开始的。

  1. 不推荐: 为了避免被否决的风险,我不推荐这样做,但是 你可以将相对路径附加到你的调用中 class:
import sys, os
sys.path.append(os.path.abspath("../Config"))
from sqlConns import * # or whatever
sys.path.pop() # clear sys.path