我正在尝试在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
ColorUtils文件夹中的init .py
from . import ColorUtils
ColorUtils.py
class ColorUtils:
def __...
Color.py
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两次的情况下调用它。
答案 0 :(得分: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了解有关相对/绝对导入的更多信息。
要解决您的实际问题,您可以这样做:
从import sys
sys
和color.py
来电
更改:import cvImageUtils.ColorUtils as ct
致:from cvImageUtils.ColorUtils import *
删除所有ct
引用,而只是使用实际功能。
__init__
。PY 更改:from . import ColorUtils
到__all__=['ColorUtils']
我能够运行color.py
以便在屏幕上打印出所有图像。
本地也生成了image.png
。
答案 1 :(得分:1)
您希望在模块搜索中公开的每个目录(我们通常隐藏test.py)都需要一个init.py文件。这应该是经验法则,通过使用sys模块,您可以将模块添加到“模块搜索路径”。
在目录中使用init.py之后,需要导入要使用的包/模块/功能: -
import cvImageUtils.ColorUtils.convert_rbg_to_grayscale
您可以在python中执行以下代码,以查看sys路径中包含的内容(由python用于搜索模块/包)
import sys
sys.path
请参阅以下链接以获取更详细的解释
https://www.programiz.com/python-programming/package
https://www.programiz.com/python-programming/modules#search