(子)模块中的Python脚本可以从其目录层次结构中的上游导入吗?

时间:2016-08-21 04:06:31

标签: python python-2.7 import sys.path

我意识到有关于Python和导入的SO上有很多帖子,但似乎有很多这些帖子都在询问有关创建实际Python包的导入规则/过程(仅针对一个项目)多个目录和python文件)。我是Python的新手,只需要对项目目录中多个py文件的上下文中访问/导入的内容有什么不可能的基本说明。

假设您有以下项目目录(要清楚,这不是sys.path上的某个软件包,而是在桌面上):

myProject/
├── __init__.py
├── scriptA.py
└── subfolder
    ├── __init__.py
    └── scriptB.py
    └── subsubfolder
        ├── __init__.py
        └── scriptC.py
        └── foo.py

我是否理解scriptC.py只有scriptB.py才能导入和使用scriptC.py中的方法或类,如果$ python scriptC.py直接通过subsubfolder并在scriptB.py内运行{1}}目录是否是通过sys.path在运行时将scriptC.py的父目录和路径添加到Python路径?

然而,foo.py可以导入scriptB.pyscriptC.py导入foo.pysys.path而无需处理jq ,对吗?只需使用相对导入路径即可访问子目录中相邻的py文件和py文件,您只能导入生活在父目录或兄弟目录中的python脚本(不使用sys.path)?

1 个答案:

答案 0 :(得分:2)

可能的

任何。

不,真的。请参阅the imp modulethe imputil module - 如果您需要一些灵感,请查看the zipimport module的编写方式。

如果您可以在变量中获得包含模块代码的字符串,则可以使用上述内容将模块放入sys.modules,并使用the ast module对其内容进行破解。方式。

在父目录中查找的自定义导入挂钩?在可能的范围内。

什么是最佳实践

你提出的建议实际上并不是很好的做法。最佳实践方法看起来更像以下内容:

myProject/
├── setup.py
└── src/
    ├── moduleA.py
    └── submodule/
        ├── __init__.py
        ├── moduleB.py
        └── subsubmodule/
            ├── __init__.py
            └── moduleC.py

此处,项目的顶部始终位于myProject/src。如果您使用setup.py配置moduleA:mainsubmodule.moduleB:mainsubmodule.subsubmodule.moduleC:main作为入口点(可能名为scriptAscriptBscriptC ),当用户运行(由setuptools自动生成)脚本时,将调用每个模块中名为main的函数。

使用此布局(并使用适当的setuptools),您的moduleC.py可以绝对import moduleAimport submodule.moduleB

另一种不涉及入口点的方法,用于调用moduleC.py中的代码(同时保持模块的预期层次结构完好无损,并假设您处于虚拟环境中python setup.py develop已被运行),如此:

python -m submodule.subsubmodule.moduleC