2

我意识到在 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可以在其中导入和使用方法或类的唯一方法是scriptB.py如果我在运行时将父目录和路径添加到 Python 路径?scriptC.py$ python scriptC.pysubsubfolderscriptB.pysys.path

但是,有可能scriptC.py导入foo.pyscriptB.py导入scriptC.pyfoo.py不处理sys.path,对吗?仅通过使用相对导入路径就可以访问子目录中的相邻 py 文件和 py 文件,您只是无法导入位于父目录或同级目录中的 python 脚本(不使用 sys.path)?

4

1 回答 1

2

什么是可能的

任何事物。

不完全是。查看模块imp模块——如果你想要一些灵感,看看模块是如何编写的imputilzipimport

如果您可以在变量中获取包含模块代码的字符串,则可以让模块使用上述内容,并可能途中sys.modules使用模块修改其内容。ast

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


什么是最佳实践

你提出的实际上并不是好的做法。最佳实践方法看起来更像如下:

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),那么当用户运行(由 setuptools 自动生成的)如此命名的脚本时,将调用每个模块中命名的函数。submodule.subsubmodule.moduleC:mainscriptAscriptBscriptCmain

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


另一种不涉及入口点的方法来调用您的代码moduleC.py(同时保持模块的预期层次结构完整,并假设您在python setup.py develop已运行的 virtualenv 中),如下所示:

python -m submodule.subsubmodule.moduleC
于 2016-08-21T04:26:10.010 回答