2017-02-27 63 views
1

我试图从多个位置导入模块,但无法使其工作,因为Python3中的相对导入已被禁用。我想这样做,以便用户可以复制package_1并在终端上运行它(使用主类);而另一个类被导入到作为web应用程序前端的scriptb.py中。从多个位置导入模块时python3相对导入

-- projectfolder 
-- projectfolder/ 
-- __init__.py 
--- package_1/ 
------ __init__.py 
------ subpackage_a/ 
------ subpackage_a/core/module1.py 
------ subpackage_a/__init__.py 
------ subpackage_a/core/__init__.py 
------ run.py 
--- package_2/ 
----- __init__.py 
-- -- scriptb.py 

在此间举行的 “package_1/run.py” 进口: 从subpackage_a.core.module1进口类名

这里是 “package_2/scriptb” 进口: package_1.run进口类名

然而,当我运行scriptb.py我得到run.py 导入错误以下错误:没有模块名为“package_1.core”

Traceback: 
File "/directory/package_1/run.py", line 7, in <module> 
    from subpackage_a.common.exceptions import Classname 
ImportError: No module named 'subpackage_a.common' 

有没有更好的方法来处理这个问题,然后捕获ImportError异常并在所有“package_a”模块中定义两个导入位置?

或不是做这个这意味着导入每个模块两次

if __name__ == '__main__': 
    from package_1 import classname 
else: 
    from .package_1 import classname 

感谢

编辑好:

以供将来参考我不得不这样做的子包导入其他模块核心文件夹

try: 
    from package_1.core.module1 import classname: 
except ImportError: 
    from ..core.module2 import classname 

以下仅作品主:

if __name__ == '__main__': 
    from package_1.core.module1 import classname: 
except ImportError: 
    from .package_1.core.module2 import classname 

回答

1

所有子目录必须__init__.py,如果你想使用它作为一个包。尝试实现以下文件结构。

-- projectfolder 
-- projectfolder/ 
-- __init__.py 
--- package_1/ 
------ __init__.py 
------ subpackage_a/ 
-----------__init__.py********** 
------ subpackage_a/core/module1.py 
-------------------core/ 
-----------------------__init__.py********** 
------ run.py 
--- package_2/ 
----- __init__.py 
-- -- scriptb.py 

__init__.py文件添加到subpackage_a文件夹和subpackage_a /核心/文件夹

编辑:我觉得你处理这种方式是更好的选择

if __name__ == '__main__': 
    from package_1 import classname 
else: 
    from .package_1 import classname 
+0

感谢您的回复。所有的软件包都有__init__.py文件。我将编辑帖子,因为我忘了输入它们。 – budge

+0

该死的,我不能使用“if __name__ =='__main__':”在子包内,因为它们不被称为主程序,所以我仍然这样做有同样的问题。假设我必须捕获ImportError异常.. – budge

1

那么,正如你可以看到你的文件夹结构和使用“subpac “package_1/run.py”和“package_2/scriptb.py”中的“kage_a”,实际上,“subpackage_a”不是“package_1”的子包。更好地调整项目的实际情况,使“subpackage_a”成为一个真正的软件包,并使用distutils或类似软件将它安装到python中。然后,“run.py”和“scriptb.py”都可以使用它,而不会回复到任何相关的导入攻击。