我意识到有关于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.py
或scriptC.py
导入foo.py
或sys.path
而无需处理jq
,对吗?只需使用相对导入路径即可访问子目录中相邻的py文件和py文件,您只能导入生活在父目录或兄弟目录中的python脚本(不使用sys.path)?
答案 0 :(得分:2)
任何。
不,真的。请参阅the imp
module,the 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:main
,submodule.moduleB:main
和submodule.subsubmodule.moduleC:main
作为入口点(可能名为scriptA
,scriptB
和scriptC
),当用户运行(由setuptools自动生成)脚本时,将调用每个模块中名为main
的函数。
使用此布局(并使用适当的setuptools),您的moduleC.py
可以绝对import moduleA
或import submodule.moduleB
。
另一种不涉及入口点的方法,用于调用moduleC.py
中的代码(同时保持模块的预期层次结构完好无损,并假设您处于虚拟环境中python setup.py develop
已被运行),如此:
python -m submodule.subsubmodule.moduleC