Python项目结构:“;未解析引用“;
我的python项目结构如下:Python项目结构:“;未解析引用“;,python,pycharm,Python,Pycharm,我的python项目结构如下: - project/ +- package/ +- db/ +- __init__.py +- mydb.py +- tests/ +- context.py +- mytest.py +- file.py 在project/package/db/_init__.py中,我将mydb声明为: from package.db import mydb 通过此声明,我可以使用file.py中的mydb函数,使用: import package.db a
- project/
+- package/
+- db/
+- __init__.py
+- mydb.py
+- tests/
+- context.py
+- mytest.py
+- file.py
在project/package/db/_init__.py
中,我将mydb声明为:
from package.db import mydb
通过此声明,我可以使用file.py
中的mydb
函数,使用:
import package.db as db
db.mydb.myfunction()
但是我也希望在project/tests
目录中使用这个函数。因此,我添加了一个project/tests/context.py
文件,其中包含:
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
import package.db as db
在mytest.py
中:
from context import db
db.mydb.myfunction()
它工作得很好
但是PyChar说:
(在context.py中)是未使用的导入语句import package.db as db
- 来自上下文导入数据库的
(在mytest.py中)包含未解析的(上下文)引用
包
和测试
文件夹中没有\uuuu init\uuuuu.py
文件;这意味着它不是python包。-如果你想让他们这么做context.py
文件中使用导入,因此为了修复它,您需要删除该行\uuuu init\uuuuuu.py
文件中放入哪些内容\uuuu init\uuuuu.py
文件是Python将目录视为包含包所必需的;这样做是为了防止具有公共名称(如字符串)的目录无意中隐藏稍后在模块搜索路径上出现的有效模块。在最简单的情况下,init.py可以只是一个空文件,但它也可以为包执行初始化代码或设置\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu变量,后面将介绍
我将使用的结构:
- package_name
- db
- __init__.py
- my_db.py
- tests
- __init__.py
- my_test.py
- __init__.py
您只需要添加my_db.py
文件中的代码:
def my_function():
return 1
在您的my_test.py
文件中,您将拥有:
from package.db import mydb
mydb.my_function()
这就是你所需要的;关于通过\uuuu init\uuuuuuuuy.py
文件更改导入,如果您确实需要,请查看\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuo>。非常感谢您的解释,非常清楚!我用你的建议纠正了我的结构,效果很好。我是否仍然需要在db/\uuuu init\uuuuuuuuuuuupy文件(我问题中的第二个代码块)中维护导入?我个人喜欢尽可能保持我的\uuuuuuuuuuuuuuuupy
文件干净;我放在那里的唯一一件事就是对导入的任何操作(使用\uuuu all\uuuuu
-阅读更多关于它的信息,这很有趣…)-因此,不,我认为您不需要在\uuu init\uuuuu.py
文件中维护导入换言之;您可以从您的库导入操作将为用户导入的内容*
;它是使用\uuuu init\uuuuuuuuuuy.py
文件中的\uuuuuu all\uuuuuuuuuuuuuuuuuuuuuu>变量指定的。如果我从包外或包内启动我的函数,它会工作。但是如果我启动my_test.py
,我会得到一个ModuleNotFoundError:没有名为“package”的模块
。知道为什么吗?我认为这就是使用“上下文”文件的原因好的,找到了。我需要使用python-m package.tests.my_test
调用
和no`/`以及不使用.py
扩展名