Python无法在父级中引用模块

问题描述 投票:0回答:2

我想在python中建立一个库。我已经创建了一个setup.py文件,并在其下的文件夹中有一个库文件夹,然后我尝试创建一个示例和测试文件夹(用于示例代码和我将包含的测试)

文件夹:

- setup.py
- cvImageUtils # this is the library
     - __init__.py # this includs ColorUtils
     - ColorUtils.py # this includes a class called ColorUtils
- examples
     - color.py # this is shown below

init.py在一个文件夹ColorUtils

from . import ColorUtils

color U替LS.朋友

class ColorUtils:
    def __...

color.朋友

from cvImageUtils import ColorUtils
m1 = cv2.imread(os.path.join(image_folder, "bb.jpeg"), 1)  # 1 = load color
cv2.imshow('grayscale', ColorUtils.convert_rbg_to_grayscale(m1))

首先,它说,无法找到模块,所以我根据另一个SO解决方案在文件的顶部添加了以下内容:

import sys
sys.path.append('../')

现在这似乎已经打破了我,但它确实让我超过了找到的无模块,但现在它说ColorUtils has no method convert_rbg_to_grayscale。那么我不得不把它改成ColorUtils.ColorUtils.convert_rbg_to_grayscale

cv2.imshow('grayscale', ColorUtils.ColorUtils.convert_rbg_to_grayscale(m1))

如何设置文件夹以便它允许我包含没有sys的库,并在不声明ColorUtils两次的情况下调用它。

python python-3.x
2个回答
2
投票

改变你的__init__.py

from cvImageUtils.ColorUtils import ColorUtils

我认为你不再需要import sys了,而且你没有两次导入ColorUtils。但就像你必须实例化一个对象一样,你应该创建一个ColorUtils对象。

我个人的偏好是不会为Utils创建一个Class。

你可能已经这样做了,但如果你想直接从类中使用一个方法,就像你在python中那样,你可能想要声明它static

class ColorUtils:
      @staticmethod
      def util_method():
          pass

那么你可以这样做:

ColorUtils.util_method()

更新:

你可以从here上阅读更多关于相对/绝对导入的信息。

为了解决你的实际问题,你可以这样做:

color.py

  1. import sys删除你的syscolor.py电话
  2. 改变:import cvImageUtils.ColorUtils as ct to:from cvImageUtils.ColorUtils import *
  3. 删除所有ct引用,而不是使用实际的功能。

cvImageUtils/__init__.py

改变:from . import ColorUtils__all__=['ColorUtils']

我能够运行color.py来获取屏幕上打印的所有图像。 image.png也在当地生成。


1
投票

您希望在模块搜索中公开的每个目录(我们通常隐藏test.py)都需要一个init.py文件。这应该是经验法则,通过使用sys模块,您可以将模块添加到“模块搜索路径”。

在目录中使用init.py之后,需要导入要使用的包/模块/函数: -

import cvImageUtils.ColorUtils.convert_rbg_to_grayscale

您可以在python中执行以下代码,以查看sys路径中包含的内容(由python用于搜索模块/包)

import sys
sys.path

请查看以下链接以获取更详细的说明 qazxsw poi qazxsw poi

© www.soinside.com 2019 - 2024. All rights reserved.