假设我有一个文件夹Awesome_stuff/my_module
,它包含以下文件:my_algorithm.py
,my_settings.py
,my_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
文件,如下所示:
运行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
文件,这是不可能的(据我所知),唯一的方法是使用绝对和相对导入。在
因为您添加了一个
__init__.py
文件,所以您已经制作了一个包。现在,从包导入时必须使用该包名称:相关问题 更多 >
编程相关推荐