Python 3 - 如何正确加载模块

时间:2017-02-28 21:47:58

标签: python-3.x

我在同一级别上有以下简单文件夹,并且想知道从foo1加载subfoo1foo2的好方法是什么?此外,我想从foo2加载main

MyFolder/main.py
MyFolder/Folder1/Subfolder1/subfoo1.py
MyFolder/Folder1/foo1.py                                                                   
MyFolder/Folder2/foo2.py

我知道有类似的问题,但我不理解最佳做法。到目前为止,我正在使用sys.path.append()。这里有__init__.py的目的吗?我很感激一些建议。

1 个答案:

答案 0 :(得分:1)

如果您从main.py运行应用程序 (并且没有关于您的问题的其他相关详细信息丢失),那么我会这样做:

MyFolder/main.py内,我会写:

from Folder2.foo2 import *  # Or import single functions or classes

并从MyFolder/Folder2/foo2.py内部编写

from Folder1.foo1 import *
from Folder1.Subfolder1.subfoo1 import *

我在我的文件系统上复制了你的结构,我也尝试了它,它对我有用。

如果您还运行__main__ MyFolder/Folder2/foo2.py(正如您所说,可能会在评论中发生),那么这将无效,因为在以下导入中:

from Folder1.foo1 import *
from Folder1.Subfolder1.subfoo1 import *

Python显然不知道什么是Folder1(及其所有子文件夹或模块),因为您的新根文件夹是Folder2,您可以从__main__文件导入模块或包只有当它们位于您运行__main__文件的文件夹(或包)下时。

您可以通过将MyFolder附加到sys.path(即执行类似于您正在执行的操作)或通过以不同方式设置项目来解决此问题,即通过在包的根文件夹下有一个setup.py文件。我想说,最后一个选项实际上是处理Python包和模块的最严格的选择,如果你没有创建一个玩具程序。

检查我为其中一个项目创建的setup.py this example。但是如果你对这个选项感兴趣(并且,如果你有时间,你应该),我会鼓励你阅读一篇关于如何使用setup.py文件创建项目的体面教程,我会尝试理解它是如何以及为何有用等等。

关于__init__.py个文件。它们可能是空文件(但可以包含可运行的代码和注释),您可以将它放在项目的文件夹下,以指示Python将这些文件夹视为Python包...我再次鼓励您阅读一个(或多个)教程( s)关于该主题。

从Python 3.3中,您不需要再将这些__init__.py文件放在您的文件夹下,以使它们被视为包。

因此,如果您使用的是Python 3.3之前的版本,并且未在项目文件夹下包含__init__.py,那么我的第一个解决方案可能无法正常工作(但我不确定100 %)...