我在同一级别上有以下简单文件夹,并且想知道从foo1
加载subfoo1
和foo2
的好方法是什么?此外,我想从foo2
加载main
。
MyFolder/main.py
MyFolder/Folder1/Subfolder1/subfoo1.py
MyFolder/Folder1/foo1.py
MyFolder/Folder2/foo2.py
我知道有类似的问题,但我不理解最佳做法。到目前为止,我正在使用sys.path.append()
。这里有__init__.py
的目的吗?我很感激一些建议。
答案 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 %)...