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 package
或 no 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?
我知道这个问题已经被问了很多,我也阅读了数十篇关于这个问题的博客,但肯定有一些我遗漏的东西。
我的理解是使用 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 package
或 no 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?