python源代码组织和_init.py__

python源代码组织和_init.py__,python,packages,Python,Packages,我有一个python源代码树,其组织如下: >folder |-> utils |-> image.py |-> helper.py |-> __init__.py |-> core |-> vf.py |-> __init__.py 现在在vf.py中,我有以下行要导入utils import utils 然后我做了一些类似的事情: img = ut

我有一个python源代码树,其组织如下:

>folder
   |-> utils
        |-> image.py
        |-> helper.py
        |-> __init__.py

   |-> core
        |-> vf.py
        |-> __init__.py
现在在vf.py中,我有以下行要导入utils

import utils
然后我做了一些类似的事情:

img = utils.Image()
现在,如果我将utils目录中的
\uuuu init\uuuu.py
文件保留为空,则此操作不起作用,并且会出现错误:

AttributeError: 'module' object has no attribute 'Image'
但是,如果我在utils目录的
\uuuu init\uuuu.py
中添加以下行,它将起作用:

from image import *
from helper import *
因此,我猜想,当调用顶级脚本时,它会解析这个
\uuu init\uuuuuuuy.py
文件,并从这个utils包导入所有方法和类。但是,我觉得这不是一个好主意,因为我正在进行*导入,这可能会污染名称空间

因此,我想知道是否有人能解释一下实现这一点的适当方法,也就是说,如果我有并行目录,那么将类从一个python包导入到另一个python包的好方法是什么(如果这种
\uu init\uuuuuuuuupy
方法确实不像我所怀疑的那样干净)。

您尝试过使用“img=utils.image.image()”吗? 如果“Image”类是在“Image.py”文件中定义的,我认为这会起作用。

您尝试过使用“img=utils.Image.Image()”吗? 如果“Image”类是在“Image.py”文件中定义的,我认为这会起作用。

您尝试过使用“img=utils.Image.Image()”吗? 如果“Image”类是在“Image.py”文件中定义的,我认为这会起作用。

您尝试过使用“img=utils.Image.Image()”吗?
如果“Image”类是在“Image.py”文件中定义的,我认为这会起作用。

导入模块时,会执行
\uuuu init\uuuuuuuuupy
文件。因此,当您编写
import-utils
时,将调用
\uu init\uuuuuuuuuuuuupy.py
中的代码,并从Image.py导入
Image

例如,将以下代码写入
\uuuu init\uuuu.py

print("Hello, my utils module!")
(仅用于测试,ofc!)


当您执行程序时,您将看到此文本当您导入模块时,将执行
\uuuu init\uuuuuuy.py
文件。因此,当您编写
import-utils
时,将调用
\uu init\uuuuuuuuuuuuupy.py
中的代码,并从Image.py导入
Image

例如,将以下代码写入
\uuuu init\uuuu.py

print("Hello, my utils module!")
(仅用于测试,ofc!)


当您执行程序时,您将看到此文本当您导入模块时,将执行
\uuuu init\uuuuuuy.py
文件。因此,当您编写
import-utils
时,将调用
\uu init\uuuuuuuuuuuuupy.py
中的代码,并从Image.py导入
Image

例如,将以下代码写入
\uuuu init\uuuu.py

print("Hello, my utils module!")
(仅用于测试,ofc!)


当您执行程序时,您将看到此文本当您导入模块时,将执行
\uuuu init\uuuuuuy.py
文件。因此,当您编写
import-utils
时,将调用
\uu init\uuuuuuuuuuuuupy.py
中的代码,并从Image.py导入
Image

例如,将以下代码写入
\uuuu init\uuuu.py

print("Hello, my utils module!")
(仅用于测试,ofc!)


当你执行你的程序时,你会看到这段文字,我不得不做一些事情:

from utils import image
img = image.Image()
或者

from utils.image import Image
img = Image()

然后我可以留下一个空白的
\uuuu init\uuuu.py
文件,它很好。

我必须做一些事情,比如:

from utils import image
img = image.Image()
或者

from utils.image import Image
img = Image()

然后我可以留下一个空白的
\uuuu init\uuuu.py
文件,它很好。

我必须做一些事情,比如:

from utils import image
img = image.Image()
或者

from utils.image import Image
img = Image()

然后我可以留下一个空白的
\uuuu init\uuuu.py
文件,它很好。

我必须做一些事情,比如:

from utils import image
img = image.Image()
或者

from utils.image import Image
img = Image()

然后我可以留下一个空白的
\uuuu init\uuuuuuuuuuuuuupy
文件,它很好。

我以为它是
\uuuuuuu init\uuuuuuuuuupy
而不是
\uuuuuuuuuu init.py
。为什么猜猜它是怎么工作的?你看过文件了吗?我以为它是
\uuuu init\uuuuuuy.py
而不是
\uuuuuu init.py\uuuuuuuu
。为什么猜猜它是怎么工作的?你看过文件了吗?我以为它是
\uuuu init\uuuuuuy.py
而不是
\uuuuuu init.py\uuuuuuuu
。为什么猜猜它是怎么工作的?你看过文件了吗?我以为它是
\uuuu init\uuuuuuy.py
而不是
\uuuuuu init.py\uuuuuuuu
。为什么猜猜它是怎么工作的?你看过文件了吗?是的,导入
*
不是一个好主意。只导入您需要的图像。是的,导入
*
不是一个好主意。只导入您需要的图像。是的,导入
*
不是一个好主意。只导入您需要的图像。是的,导入
*
不是一个好主意。导入您需要的图像。