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

标签 python python-2.7 import sys.path

我知道 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 .pyfoo.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:mainsubmodule.moduleB:mainsubmodule.subsubmodule.moduleC:main 作为入口点(可能命名为 scriptAscriptBscriptC),然后是名为 main 的函数当用户运行如此命名的(由 setuptools 自动生成的)脚本时,将调用这些模块中的每一个。

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


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

python -m submodule.subsubmodule.moduleC

关于python - (子)模块中的 Python 脚本是否可以从其目录层次结构中的上游导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39060757/

相关文章:

iOS:将结构作为参数传递

python - 让 Pipenv 在同一文件夹中创建 virtualenv

python - If not (variable) 和 if (variable) == false 有什么区别?

python - 在 Python 中将整数转换为二进制

python - 当用户运行脚本时,如何在 Python 中写入文本文件?

r - 使用ff包导入文本文件

Python 通过不同路径导入相同对象 - 类属性和基元之间的不同行为

python - 尝试使用 Measurement Protocol 将数据发送到 Google Analytics

python - 尽管输入类型看似正确,但 int(string, base=16) 的文字无效

python - random.randint 不生成随机值