从父级导入Python';s子文件夹
我有个问题。我有如下目录设置:从父级导入Python';s子文件夹,python,import,Python,Import,我有个问题。我有如下目录设置: folder/ main.py /stuff/ __init__.py function.py /items/ __init__.py class.py 我的问题是如何将class.py导入function.py?此设置非常具体,无法更改。要让它工作,我需要做些什么?只要应用程序是通过main.py启动的,您当前的目录
folder/
main.py
/stuff/
__init__.py
function.py
/items/
__init__.py
class.py
我的问题是如何将class.py导入function.py?此设置非常具体,无法更改。要让它工作,我需要做些什么?只要应用程序是通过
main.py
启动的,您当前的目录结构似乎很理想
Python将始终自动将主脚本的父目录添加到sys.path
的开头(即示例中的文件夹
)。这意味着在搜索不属于标准库的模块和包时,导入机制将给予该目录优先级
鉴于此,您可以将classes.py
模块导入function.py
,如下所示:
from items import classes
(注意,我已经重命名了模块,因为class
是一个python关键字)
如果您后来将另一个模块添加到stuff
,并希望将其导入functions.py
,您将执行以下操作:
from stuff import another
from items.subpackage import module
如果将一个子包添加到项中
,并且您希望从该子包中导入模块,您将执行以下操作:
from stuff import another
from items.subpackage import module
以这种自上而下的方式指定的导入可以从应用程序中的任何模块中使用,因为它们总是相对于主脚本的父目录,具有优先级。将父文件夹添加到PYTHONPATH(
sys.path.append(…)
)然后您只需从class.py
中的stuff init function执行。这是一个解决方案…答案的确定副本的可能副本是from。。导入项目
或来自..项目导入类
我尝试了来自。。导入项目,但我一直收到以下错误:ValueError:尝试在toplevel Package之外进行相对导入对我不起作用。您能解释一下这是如何工作的吗?因为我在每个文件夹中都有与\uuu init\uuuuu.py
文件相同的体系结构,但当我尝试导入时,它不起作用。@YohanObadia。我没有什么可以补充的,这很好地解释了这一点。必须使用包含包的目录中的main.py脚本启动应用程序。容器目录本身不是包。这个问题非常清楚地显示了正确的目录结构。这就是我所说的更多细节。是否需要main.py
?如果是,为什么它可以像\uuu init\uuuu.py
文件一样为空。“我想你的回答会更清楚一些。”约哈诺巴迪亚。我认为启动应用程序需要运行脚本是不言而喻的。这种脚本的传统名称是main.py,但您可以随意调用它。老实说,你让事情变得比实际情况复杂得多:-)。您只需将启动脚本放在包含包的目录中。这就是它的全部。如果由于某种原因无法使其工作,则需要提供特定目录结构的完整详细信息以及收到的任何错误消息。@YohanObadia。应用程序具有启动各种进程的脚本。如果您希望所有导入都能正常工作,而不会出现丑陋的sys.path
hacks,那么这些启动脚本必须位于顶级容器目录中,而不是子目录中。这就是Python的工作原理,这也是我的答案的基础。