【问题标题】:Python 3 import a module issuePython 3 导入模块问题
【发布时间】:2021-06-27 11:44:10
【问题描述】:

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

我的理解是使用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_dbimport dbfrom db import read_dbfrom db.read_db import *

我尝试在 db 和 server 文件夹中包含一个 __init__.py 文件(在两者中,并且在一个但不是另一个中)以及使用点语法(例如 from .db import read_db)进行相对导入。

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

attempted relative import with no known parent packageno module named

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

【问题讨论】:

    标签: python-3.x import module package


    【解决方案1】:

    所以可能答案是我在服务器文件夹中从控制台运行 server1.py(通过 uvicorn),因此似乎无法访问父级(即使通过点语法)。如果改为在 app 文件夹中并运行 uvicorn servers.server1:app 我能够导入 db 并在其中调用任何内容。我想这是有道理的,但它的行为方式似乎也很奇怪......而且博客文章中似乎没有任何内容表明这是一个“明显的”问题。

    【讨论】:

      【解决方案2】:

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

      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?

      【讨论】:

      • 你是对的。入口点不正确。没有main.py 或任何东西,只是运行服务器python 的东西在它所在的文件夹中 这是问题所在。从根应用程序文件夹运行它解决了这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 2019-04-04
      • 2015-09-26
      • 1970-01-01
      • 2019-07-25
      相关资源
      最近更新 更多