Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从多个位置导入模块时python3相对导入_Python_Python 3.x_Python Import_Relative Path - Fatal编程技术网

从多个位置导入模块时python3相对导入

从多个位置导入模块时python3相对导入,python,python-3.x,python-import,relative-path,Python,Python 3.x,Python Import,Relative Path,我正在尝试从多个位置导入模块,但无法使其工作,因为Python3中的相对导入已被禁用。我想这样做,以便用户可以复制包_1并在终端上运行它(使用main类);而另一个类则导入到scriptb.py中,后者是web应用程序前端 -- projectfolder -- projectfolder/ -- __init__.py --- package_1/ ------ __init__.py ------ subpackage_a/ ------ subpackage_a/core/module1.

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

-- 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”导入: 从子包_a.core.module1导入类名

以下是“package_2/scriptb”导入: 包_1.run导入类名

但是,当我运行scriptb.py时,在run.py中会出现以下错误 ImportError:没有名为“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'
谢谢

编辑:

作为将来的参考,我必须在子包中这样做,以导入核心文件夹中的其他模块

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

如果要将其作为包使用,则所有子目录都必须具有\uuuu init\uuuu.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
\uuuuu init\uuuuuu.py文件添加到子包a文件夹和子包a/core/文件夹

已编辑:我认为您处理此问题的方式是一个更好的选择

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

正如您从文件夹结构以及“package_1/run.py”和“package_2/scriptb.py”中“subpackage_a”的用法所看到的,实际上,“subpackage_a”不是“package_1”的子包。更好地使您的项目适应现实,使“subpackage\u”成为一个真正的包,并使用distutils或类似的东西将其安装到python中。然后,“run.py”和“scriptb.py”都可以使用它,而无需恢复到任何相关的导入攻击。

感谢您的回复。所有包都有init.py文件。我会编辑帖子,因为我忘了键入它们。该死,我不能在子包中使用“if name=='main':”,因为它们没有被称为主程序,所以我仍然有同样的问题。假设我必须抓住这个例外。。
if __name__ == '__main__': 
    from package_1 import classname
else:
    from .package_1 import classname