Python3导入模块问题

Python 3 import a module issue

我知道这个问题已经被问了很多,我也阅读了数十篇关于这个问题的博客,但肯定有一些我遗漏的东西。

我的理解是使用 sys.path 方法不是 pythonic,所以我正在尝试以最好的方式做到这一点。

我有一个具有以下文件结构的应用程序:

application
  ├── db
  │   └── db_setup.py
  │   └── read_db.py
  │   └── write_db.py
  │   └── database.db
  │
  ├── server
  |   └── server1.py
  |   └── server1.py
  |
  ├── web
      └── #contains all the files for a React web app

其中一台服务器负责处理数据库请求,因此它需要访问读写 python 文件。

我在 server1.py 中尝试了以下各项: from db import read_db import db from db import read_db from db.read_db import *

我试过在 db 和服务器文件夹中包含一个 __init__.py 文件(在两个文件夹中,在一个文件夹中但不在另一个文件夹中)以及使用点语法进行相对导入(例如 from .db import read_db).

我总是会遇到以下错误之一:

attempted relative import with no known parent packageno module named

我唯一能想到的是,在这样的应用程序中,不可能定义可以导入到同一应用程序中其他应用程序的模块或包...但这听起来不对。

所以答案可能是我在服务器文件夹中时从控制台 运行 server1.py(通过 uvicorn),所以似乎无法访问父级(即使通过点语法)。如果不是在应用程序文件夹中并且 运行 uvicorn servers.server1:app 我能够导入数据库并调用其中的任何内容。我想这是有道理的,但它似乎也确实如此 运行ge 它的行为方式......并且博客文章中没有任何内容似乎将其指向“显而易见的”问题。

你的切入点在哪里?您应该在根文件夹上有一个入口点,它应该如下所示:

application
  |
  ├── main.py
  |
  ├── db
  │   └── db_setup.py
  │   └── read_db.py
  │   └── write_db.py
  │   └── database.db
  │   └── __init__.py
  |
  ├── server
  |   └── server1.py
  |   └── server1.py
  │   └── __init__.py
  |
  ├── web
      └── #contains all the files for a React web app

如果您从 main.py 启动应用程序,您应该让所有模块都可用于所有其他模块。

例如你的 db/write_db.py:

中有这个方法
def addToDatabase():
   print("adding entry to db")

然后你可以像这样从 server/server1.py 访问方法:

from db import write_db

def server():
   write_db.addToDatabase()

不要忘记在每个子文件夹中都有一个 init.py 否则它将无法工作。

来源: Import paths - the right way?