2016-04-26 48 views
0

我有两个项目,组织根据以下结构如何让这个文件夹结构作为Python模块工作?

core 
* src 
    * main 
    * python 
     * module 
     * __init__.py 
     * tools.py 
extension 
* src 
    * main 
    * python 
     * module 
     * submodule 
      * __init__.py 
      * usercode.py 

同时考虑src/main/pythonPYPATH

不幸的是,当我做import module.submodule.usercode,我得到的是

ImportError: No module named submodule 

哪有我解决这个问题?

编辑1

通知我想从我的分机使用tools.py从我的核心模块旁边的usercode.py ......其中,根据Python模块加载机制,使它不可能对我来说,有一个__init__.py文件在我的extension/src/main/python/module文件夹中,就像建议的大多数答案一样。

EDIT 2

我要细说了

  • 的几件事情在生产模式中,Python代码是由行家过程中提取并组装成一个简单的文件夹寻找或多或少像

    • 模块
      • 初始化的.py
      • tools.py
      • 子模块
      • 初始化的.py
      • tools.py
  • 在开发者模式,separatly存在两个项目,我从extension/src/test运行代码。

很明显,我的问题只存在于开发模式。

回答

0

最后,我在测试类使用__init__.py,从core在测试开始复制到extension有代码普通的目录,并删除在测试结束。对于代码分发,我依靠一些魔法魔术。

0

确保您所有的Python包中都有一个__init__.py

extension 
* src 
    * main 
    * python 
     * module 
     * __init__.py # You're missing one here 
     * submodule 
      * __init__.py 
      * usercode.py 
+0

编辑问题,指出为什么这个解决方案不适用于我。 – Riduidel

+0

@Riduidel你使用哪个模块?什么是文件夹结构? – Bahrom

1

packages文档:

__init__.py文件,才能使Python视该目录为一个包;这是为了防止具有通用名称的目录(例如字符串)无意中隐藏稍后在模块搜索路径中发生的有效模块。在最简单的情况下,__init__.py可以只是一个空文件,但它也可以执行包的初始化代码或设置__all__变量,稍后介绍。

所以治疗module目录作为一个包,你需要往其中加一个__init.py__文件:

extension 
* src 
    * main 
    * python 
     * module 
     * __init__.py # add this file to treat the directory as a module 
     * submodule 
      * __init__.py 
      * usercode.py 

UPDATE:

从你使用的文件夹模式,它看起来更像一个java项目的组织。在python你并不需要这么复杂的结构。但如果你真的想要这个结构,你需要将__init__.py添加到所有的文件夹中。

但是我建议是这样的:

core 
    * __init__.py 
    * module 
    * __init__.py 
    * tools.py 

extension 
    * __init__.py 
    * module 
    * __init__.py 
    * submodule 
     * __init__.py 
     * usercode.py 

然后可以导入类似以下内容:

from core.module import tools 

,或者

from extension.module.submodule import usercode 

请注意__init__.py文件中的每个目录,尽管我删除了一些目录以使结构看起来更加pythonic。

+0

编辑的问题,以表明为什么这种解决方案不适用于我(但我upvoted你的答案,但迄今为止,这是迄今为止最好的) – Riduidel

+0

@Riduidel请检查更新的答案。 – AKS

0

模块还需要一个__init__文件,因此这将是一个Python包,而不是