【问题标题】:File hierarchy and local imports文件层次结构和本地导入
【发布时间】:2020-12-29 18:50:11
【问题描述】:

我正在尝试找出 python3 中的文件层次结构和本地导入。我遇到了以下文件结构的问题:

└── project
    ├── run.py
    └── scripts
        ├── __init__.py
        ├── misc.py
        ├── script1.py
        └── script2.py

我对“脚本”目录中的所有文件使用相对导入。

from misc import x, y, z

我在run.py 中使用绝对导入。

from scripts.misc import a, b, c
from scripts.script1 import more_stuff

我的目标是让 python 文件独立且功能齐全。但是,当我尝试执行run.py 时,我遇到了错误。

from misc import x, y, z
ModuleNotFoundError: No module named 'misc'

我希望相对路径是相对于原始文件的,而不是采用执行文件的路径。我可以通过修改导入或文件结构来解决这个问题吗?

看来我也不明白__init__.py 的工作原理。我想重新使用通用包名称(如“脚本”)。我曾假设__init__.py 文件将在相对于已执行文件的下游立即读取:如果执行run.py,则仅应考虑同一级别的脚本目录。我发现一个遥远的(不相关的?)“脚本”目录获得优先权。这是否可以通过更谨慎的绝对路径来解决?下面的例子。

└── dir
    └── project1
    |   ├── run.py
    |   └── scripts
    |       ├── __init__.py
    |       └── settings.py
    └── subdir
        └── project2
            ├── run.py
            └── scripts
                ├── __init__.py
                └── settings.py

从 "project1" 执行 run.py 将尝试从 project2 导入 "scripts" 目录。

cannot import name 'variable' from 'scripts.settings' (/Users/.../dir/subdir/project2/scripts/settings.py)

从 project2/scripts 中删除 __init__.py 在从 "project1" 执行 run.py 时不再产生错误。

【问题讨论】:

    标签: python-3.x import hierarchy


    【解决方案1】:
    1. 你是说:

    我对“脚本”目录中的所有文件使用相对导入。

    从杂项导入 x, y, z

    但这不是相对的。对于亲戚,你需要有

    from .misc import x, y, z
    
    1. 要了解为什么不相关的脚本优先,请查看您的sys.path 并验证它是否确实位于您的脚本包之前。我可以假设这是 ide 路径操作的一些剩余部分。

    【讨论】:

    • 问题 2 似乎与一个奇怪的 iPython 行为有关。当我打开一个新的 iPython 控制台时,sys.path 中的第一个值将替换为最后执行的脚本的父目录。我刚刚通过在我的下载目录中创建一个新的 python 文件来测试这一点。现在“/Users/username/Downloads”出现在我的 sys.path 的顶部,而不是“/Users/username/anaconda/bin”。运行时不会通过命令行发生此行为:ipython -c "import sys; print(sys.path)"。如果找不到更好的解决方案,我可能会编写一些脏代码来强制返回正确的 sys.path 值。
    • 问题 1 看起来像包中的补充模块不应该独立运行。使用 if/else 来确定应该如何调用导入,如 stackoverflow.com/questions/16981921/… 应该可以工作。
    • 关于问题 2 的附加信息:Spyder iPython 控制台具有在生成新控制台时选择当前工作目录的选项。由于不了解行为而遇到问题。
    猜你喜欢
    • 2011-08-03
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2012-01-09
    相关资源
    最近更新 更多