使子模块在同一Python modu中彼此可见

2024-04-27 00:34:27 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个文件夹Awesome_stuff/my_module,它包含以下文件:my_algorithm.pymy_settings.pymy_utils.py。 主文件my_algorithm.py包含以下行:

# my_algorithm.py
import my_utils as mu
from my_settings import My_settings

def alg():
    # do something

if __name__ == "__main__":
    alg()

运行python my_algorithm.py不会产生任何问题。但是,如果我想在Python库中安装这个模块,情况就会发生变化。为此,我在my_module文件夹内和{}文件夹外添加了一个空的__init__.py文件,如下所示:

^{pr2}$

运行python setup.py install生成egg,模块安装在Python库中。现在主文件夹Awesome_stuff包含:

Awesome_stuff.egg-info
build (folder created during installation)
dist (folder created during installation)
my_module (my original folder plus __init__.py)
setup.py

为了执行与原始文件python my_algorithm.py等效的内容,我现在可以创建一个新的Python文件test.py,它包含类似from my_module.my_algorithm import *的内容,然后执行alg()。在

不幸的是,行from my_module.my_algorithm import *生成以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "build/bdist.macosx-10.11-intel/egg/my_module/my_algorithm.py", line 25, in <module>
ImportError: No module named my_utils

如何在不修改原始三个模块的文件的情况下修复此问题?我看不出这里出了什么问题。在

而且,import my_module不会产生任何错误。我有点困惑。 为什么当模块是独立文件夹时,从同一文件夹导入子模块有效,而当它安装在Python库中时却不起作用?在

更一般的问题:导入/使用可能相互依赖的子模块的正确/建议方法是什么?在这种情况下,文件__init__.py可能起作用吗?在

谢谢。在

OS X El Captain,Python 2.7.10

编辑

作为一个例子,我查看了Python库Zen,它的结构类似于:

Zen
    build
    zen
        folder1
        folder2
        ...
        __init__.py
        graph.pxd
        graph.pyx
        digraph.pxd
        digraph.pyx
        ...
    Makefile
    setup.py

在本例中,digraph.pyx(覆盖了一些graph.pxd声明)包含from graph cimport *行,这当然不会引起任何问题。注意,它没有说:from zen.graph cimport *。在

上次编辑

使用cimport时,可以在setup.py内定义package_data,以设置*.pxd文件的路径。这就是上例中cimport不需要绝对导入的原因。但是,对于*.py文件,这是不可能的(据我所知),唯一的方法是使用绝对和相对导入。在


Tags: 模块文件frompyimport文件夹initmy
1条回答
网友
1楼 · 发布于 2024-04-27 00:34:27

因为您添加了一个__init__.py文件,所以您已经制作了一个包。现在,从包导入时必须使用该包名称:

# my_algorithm.py
import my_module.my_utils as mu
from my_module.my_settings import My_settings

def alg():
    # do something

if __name__ == "__main__":
    alg()

相关问题 更多 >