2017-02-28 62 views
1

我在同一级别上有以下简单文件夹,并想知道从foo2加载foo1subfoo1有什么好的做法?此外,我想从main加载foo2Python 3 - 如何正确加载模块

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

我知道有类似的问题,但我不明白最佳实践。到目前为止,我正在使用sys.path.append()。这里有没有__init__.py的目的?我很欣赏一些建议。

+0

是您的'main.py'唯一文件将会运行(如'__main__'),对吧? – nbro

+0

是和不是,我已经创建了一个用于数据分析的lil工具箱,其中main.py中包含主要分析。不过,我也可以使用'foo2'作为一个独立的工具(取决于'foo1')。 – Tim

+0

Sry,我不得不纠正我对一个错字的评论。 – Tim

回答

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__文件导入模块或程序包。

您可以通过附加MyFoldersys.path(即做类似于你已经做了什么事),或通过以不同的方式设置你的项目解决这个问题,这是你的包的根文件夹下有一个setup.py文件。我想说,最后一个选项实际上是处理Python包和模块的最严肃的选择,如果你不创建玩具程序。

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


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

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

因此,如果您使用的是Python 3以前的版本。3,并且您的项目文件夹下没有包含__init__.py,我的第一个解决方案可能不会工作(但我不能确定100%)...

+0

Thx提示'setup.py'。只要时间允许,我一定会研究一下。 – Tim