代码之家  ›  专栏  ›  技术社区  ›  Albert

如何同时生成包或脚本和包子模块

  •  0
  • Albert  · 技术社区  · 6 年前

    我有这样的结构:

    app.py
    sub/
        __init__.py
        lib.py
        utils.py
    

    app.py 我想做这样的事情:

    from sub.lib import some_func
    

    lib.py ,我想能够导入 utils.py .

    我也希望能执行 利比 直接作为脚本。 (即 cd sub; python3 lib.py )

    问题是,如果我开始 利比 作为一个脚本,它不会是一个包,因此,它不能使用相对导入,因此 from .utils import some_util_func 不起作用。但是,如果我导入 利比 作为其中的一部分 sub 包,只有相对导入才能工作。

    我如何解决这个问题?(简单地说。例如,不创建另一个小包装脚本,只需调用 利比 )

    例如,如果有方法标记 __main__ 模块作为一个包,它可以解决这个问题。但是如何呢?这有可能吗?例如,通过定义 __path__ 还是这样?

    2 回复  |  直到 6 年前
        1
  •  0
  •   butusk0    6 年前

    启动程序时可以设置pythonpath环境变量。

    只需从lib目录键入:

    PYTHNONPATH="path/to/root/directory" python lib.py
    
        2
  •  0
  •   Albert    6 年前

    好吧,事实上,我上次的评论确实有效。如果我在 lib.py ,似乎有效:

    import os
    
    if __name__ == '__main__':
        __path__ = [os.path.dirname(os.path.abspath(__file__))]
    

    (关于 __path__ ,例如 here )