2014-12-07 69 views
0

我有一个问题。我有这样的目录设置:Python从父级的子文件夹导入

folder/ 
     main.py 
     /stuff/ 
      __init__.py 
      function.py 
     /items/ 
      __init__.py 
      class.py 

我的问题是如何将class.py导入到function.py?此设置非常具体,无法更改。为了实现这个目标,我需要做些什么?

+0

将父文件夹添加到您的PYTHONPATH('sys.path.append(...)'),然后在'class.py'中简单地执行'from stuff init function'。这是一个解决方案... – tamasgal 2014-12-07 16:13:03

+0

可能的重复http://stackoverflow.com/questions/72852/how-to-do-relative-imports-in-python – kdopen 2014-12-07 16:20:26

+0

明确的重复http://stackoverflow.com/questions/27215912/import 27216343#27216343 – kdopen 2014-12-07 16:21:59

回答

0

只要应用程序通过main.py启动,您的当前目录结构似乎是理想的。

Python将始终自动将主脚本的父目录添加到sys.path(即您的示例中的folder)的开头。这意味着当搜索不属于标准libarary的模块和程序包时,导入机器将优先给予该目录。

鉴于此,你可以导入classes.py模块插入function.py,就像这样:

from items import classes 

(请注意,我已经改名为模块,因为class是一个Python关键字)。

如果以后添加了另一个模块stuff,并希望将其导入到functions.py,你会怎么做:

from stuff import another 

,如果子包加入items,和你想导入模块从这一点,你会怎么做:在这种自上而下的方式指定

from items.subpackage import module 

进口可以从在应用程序中的任何模块一起使用,因为他们总是RELAT主要脚本的父目录,它具有优先权。

+0

谢谢。这工作 – Punisher 2014-12-08 14:09:25

+0

不适合我。请你解释一下这是如何工作的,因为我在每个文件夹中都有'__init __。py'文件的相同体系结构,但是当我尝试导入它时不起作用。 – 2017-08-02 07:55:39

+0

@YohanObadia。我的答案并不多,这可以很好地解释。您**必须**使用包含软件包的目录中的* main.py *脚本启动应用程序。容器目录本身不是一个包。这个问题非常清楚地显示了正确的目录结构。 – ekhumoro 2017-08-02 11:02:59