我知道 SO 上有大量与 Python 和导入相关的帖子,但似乎有相当多的帖子在询问有关创建实际 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
scriptC.py
可以在 scriptB.py
中导入和使用方法或类,我的理解是否正确> 直接通过 $ python scriptC.py
运行,如果我将父目录和路径添加到 scriptB.py
,则从 subsubfolder
目录中运行在运行时通过 sys.path
到 Python 路径?
但是,scriptC.py
可以导入 foo.py
或者 scriptB.py
可以导入 scriptC .py
或 foo.py
而不处理 sys.path
,对吗?相邻的 py 文件和子目录中的 py 文件只需使用相对导入路径即可访问,您只是不能导入位于父目录或同级目录中的 python 脚本(不使用 sys.path)?
最佳答案
什么是可能的
任何东西。
不,真的。参见 the imp
module , the imputil
module -- 看看如何 the zipimport
module如果你想要一些灵感,就写了。
如果您可以在变量中获取包含模块代码的字符串,则可以使用上面的方法将模块放入 sys.modules
中,也许可以使用 the ast
module 修改其内容。正在路上。
在父目录中查找的自定义导入 Hook ?在可能性范围内。
什么是最佳实践
您提出的建议实际上并不是好的做法。最佳实践方法看起来更像是以下内容:
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
),然后是名为 main
的函数当用户运行如此命名的(由 setuptools 自动生成的)脚本时,将调用这些模块中的每一个。
使用此布局(并使用适当的设置工具),您的 moduleC.py
绝对可以import moduleA
或 import submodule.moduleB
。
另一种方法,不涉及入口点,调用 moduleC.py
中的代码(同时保持模块的预期层次结构完整,并假设您在 的 virtualenv 中python setup.py develop
已经运行)像这样:
python -m submodule.subsubmodule.moduleC
关于python - (子)模块中的 Python 脚本是否可以从其目录层次结构中的上游导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39060757/