第一次尝试创建 python 库。被 modulenotfounderror 困扰

Attempting to create a python library for the first time. Getting plagued with modulenotfounderror

创建一个简单的客户端库,以便使用我的 api 的人可以轻松使用。对 python(3 个月)相当陌生,之前从未创建过我自己的 module/library/package。我看了很多非常简单的教程,并认为我做得很好。但是尽管按照信中的说明进行操作,但我还是收到了一个模块未找到的错误。这是基本格式(注意,由于工作场所政策,我已经替换了大多数文件的名称、classes 和方法,但它应该不会对结构产生影响)

python-sdk (the name of the repository)
 |    ⊢src (my boss wants everything wrapped inside of a src directory)
 |    |    ⊢library (this will be the package that is imported by users)
 |    |    |    ⊢__init__.py
 |    |    |    ⊢filename.py
 |    |    |    |    ⊢class myclass1
 |    |    |    |    |    ⊢staticmethod()
 |    |    |    |    ⊢class myclass2
 |    |    |    |    |    ⊢method()
 |    |    test-app.py

当前文件名包含 2 个 classes(非常简单的 classes 只是为了测试)名为 myclass1 和 myclass2。每个 class 都包含一个方法,目前只是将 2 个值相加或相乘。我这样做只是为了学习创建库。我知道后面代码是怎么实现的

初始化文件包含以下内容:

from filename import myclass1, myclass2

测试应用程序很简单:

from library import myclass1, myclass2
print(myclass1.staticmethod1(15, 20))

myclassinstance = myclass2(15, 20)

print(myclassinstance.method())

根据堆栈跟踪,它从 test-app.py 的第一行开始,它看到库的导入,因此它转到库中的 init 文件。然后在 init 的第 1 行,它看到 from filename import myclass1, myclass2 并对 filename.

生气

它说:

/home/sexmaster/PycharmProjects/python-sdk/venv/bin/python /home/sexmaster/PycharmProjects/python-sdk/src/test-app.py
Traceback (most recent call last):
  File "/home/sexmaster/PycharmProjects/python-sdk/src/test-app.py", line 1, in <module>
    from library import myclass1, myclass2
  File "/home/derek1st/PycharmProjects/python-sdk/src/library/__init__.py", line 1, in <module>
    from filename import class1, class2
ModuleNotFoundError: No module named 'filename'

Process finished with exit code 1

有什么猜测吗?这应该是非常基本的。我不知道出了什么问题。我在 pycharm 中没有看到它的价值。

由于您正尝试从 __init__file 进行相对导入,因此您应该像这样在文件名前添加句点。

from .filename import myclass1, myclass2

然后就可以从包中导入了:

from library import myclass1, myclass2

请求解释如下:

当我们在包内处理相关模块时,指定完整路径有点多余,因为我们知道父模块的名称,所以相对导入基本上是一种表示找到 class, 函数或模块,因为它相对于当前模块的位置。

假设我们有以下包:

parent_directory/
      main.py
      ecommerce/
          __init__.py
          database.py
          products.py
          payments/
              __init__.py
              paypal.py
              stripe.py

如果我们在 products 模块中工作并且我们想要从 Database class 导入 Database class =]database 模块旁边我们使用相对导入:

from .database import Database

数据库前面的句号表示:使用当前包内的数据库模块。

如果我们正在编辑 ecommerce/payments 包中的 paypal 模块并且我们想使用 database 模块父包 (电子商务包) 这将按如下方式完成:

from ..database import Database

我们可以使用更多的周期在层次结构中更上一层楼,我们也可以从一侧下降到另一侧(留作 reader 的练习)

现在,请记住 __init__.py 文件将目录定义为包,它可以包含任何变量或 class 声明,它们将作为包的一部分提供,因此在我们的示例中如果ecommerce/__init__.py 文件包含这一行:

from .database import db

然后我们可以使用下一个导入从 main.py 或任何其他文件访问 db 属性:

from ecommerce import db

我个人建议不要在 __init__ 文件中放置太多代码,因为 python 开发人员实际上并不期望其中发生逻辑。

在您的特定情况下,您的 __init__.py 文件是相对于文件名模块的,这就是为什么需要进行相对导入的原因。不过,您也可以直接在 test-app.py 中进行绝对导入,如下所示:

from library.filename import myclass1, myclass2

两种导入方法都是正确的,请使用使您的代码看起来更优雅的方法

进一步阅读:

  • D. Phillips,Python 3 面向对象编程 3ed