如何在不破坏上层导入的情况下从子目录运行 Python 脚本?

Ign*_*ant 5 python python-3.x

我有一个非常简单的场景,如下所示:

example/
    common.py
    folder1/
        script.py
Run Code Online (Sandbox Code Playgroud)

其中,script.py文件应导入common.py模块。

如果我cd进入folder1/并运行脚本(即通过python3 script.py在命令行上调用),导入会因通常的错误而中断ModuleNotFoundError: No module named 'common'

我知道我可以通过__init__.py在每个子目录中添加文件来将整个父文件夹变成一个包,但是这个解决方案仍然阻止我直接从folder1/.

我怎样才能解决这个问题?

Wav*_*les 11

如果将两个目录都转换为 python 包,并且顶层目录位于 PYTHONPATH 中,则可以像这样运行 script.py:

python3 -m example.folder1.script
Run Code Online (Sandbox Code Playgroud)

  • 这是在任何子文件夹中运行任何脚本的最干净的方法! (2认同)

Ale*_*agh 3

如果您需要将父目录添加到搜索路径,您可以随时执行以下操作:

import os
import sys

DIR = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
sys.path.insert(0, DIR)
Run Code Online (Sandbox Code Playgroud)

os.path.realpath(__file__)获取文件的真实路径,并os.path.dirname获取该文件的目录名。执行两次即可获取example此处的目录。现在,由于它已添加到搜索路径中,因此您可以导入common.

但是,您确实应该考虑拥有一个专用的scriptsbin目录,而不是尝试从子目录运行脚本。考虑编写一个库,并导入该库而不是单个文件。

  • OP_确实_有一个专用的脚本目录 - 这就是整个问题。如果可以方便地将脚本放在父目录中,那么“import common”就可以正常工作。 (2认同)